我一直想用 Python and Selenium 创建一个网页爬虫,但从来没有实现它。 几天前, 我决定尝试一下,这听起来可能是挺复杂的, 然而编写代码从 Unsplash抓取一些美丽的图片还是挺容易的.
把所有东西都安装好了么? 不错! 跟着我们的代码,我将开始解释我们每一个爬虫原料的作用。
第一件事情,我们将 把 Selenium webdriver 和 geckodriver 结合起来去打开一个为我们工作的浏览器窗口。首先, 在Pycharm里创建一个项目, 根据你的系统下载最新的geckodriver , 打开下载的压缩文件然后把geckodriver文件放到你的项目文件夹里。 Geckodriver 是 Selenium 控制 Firefox的基础, 因此我们需要把它放到我们项目的文件夹里面,来让我们能使用浏览器。
接下来我们要做的就是在代码中导入Selenium的webdriver并且连接我们想要连接的URL,所以让我们这样做吧:
from selenium import webdriver
# 你想打开的url地址
url = "https://unsplash.com"
# 用Selenium的webdriver去打开页面
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
一个远程控制的Firefox窗口
很简单,是吧? 如果你每一步都操作正确, 你已经度过了困难的一部分,你应该看到和上面展示图片类似的浏览器窗口。
接下来, 我们应该下滑页面,这样在我们下载图片之前可以加载更多的图片。我们还需要等待几秒钟,以防万一网络连接缓慢,图片加载不全。由于Unsplash 是基于React构建的, 等待5秒钟似乎是合适的时间,因此我们使用time包来进行等待的操作。我们还需要使用一些Javascript代码来滚动页面
--- 我们将使用window.scrollTo() 来完成这个。把它们放到一起, 你应该得到这样的代码:
unscrape.py
import time
from selenium import webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
# 滚动页面,然后等待5秒
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
滚动页面,然后等待5秒
在测试上面的代码后,你应该看到浏览器向下滚动一些,下一件我们需要做的事情是在网页上找到那些我们想要下载的图片。在解析recat生成代码后,我发现我们能用CSS选择器在页面代码里面定位我们想要的图片。也许页面具体的布局和代码在未来可能会改变, 但是在我写代码的这个时候我们可以用 #gridMulti img 选择器来获取所有出现在屏幕里面的 <img> 标签元素
我们能用 find_elements_by_css_selector()得到这些标签元素的list集合,但是我们想要的却是是每个标签元素的src 的属性。所以,我们可以遍历list集合然后抓取它们:
unscrape.py
import time
from selenium import webdriver
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
# 选择图片标签元素,打印它们的URL
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
for image_element in image_elements:
image_url = image_element.get_attribute("src")
print(image_url)
选择图片标签元素,打印它们的URL
现在,为了真正得到我们找到的图片,我们将使用requests 包和一部分 PIL包,即 Image。我们还需要使用io包里面的BytesIO 来把图片写入一个 ./images/的文件夹,我们要在我们的项目文件夹里面创建这个文件。 这样, 把所有东西组合在一起,我们需要给每个图片的URL发送一个HTTP的GET请求,然后使用Image 和BytesIO,我们可以在我们得到的响应里面存储图片,这里是一个方法来实现这一步骤 :
unscrape.py
import requests
import time
from selenium import webdriver
from PIL import Image
from io import BytesIO
url = "https://unsplash.com"
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
i = 0
for image_element in image_elements:
image_url = image_element.get_attribute("src")
# 发送一个HTTP的GET请求,在响应里面获取并存储图片
image_object = requests.get(image_url)
image = Image.open(BytesIO(image_object.content))
image.save("./images/image" + str(i) + "." + image.format, image.format)
i += 1
下载图片
下载一大堆免费的图片几乎是你的所有需求了。显而易见的, 除非你想设计图片原型或者仅仅需要得到随机的图片,这个小爬虫是没有多大用处的。 因此,我花了一些时间,通过增加了更多的特性来提升它:
你可以(也可能应该)尝试自己去实现其中的一些功能。可用的完整版的网页爬虫这里. 记得去单独下载geckodriver并将其连接到你的项目,就像文章开头说明的那样 。
这个整体项目都是一个非常简单的概念验证,来看看网页爬虫是怎么实现完成的,意味着有很多事情可以做,来改善这个小工具:
原文来自:PythonCaff
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。