对于动态加载的网站我推荐使用selenium库来爬取
优采云 发布时间: 2021-05-09 19:00对于动态加载的网站我推荐使用selenium库来爬取
如果您要订阅此博客的内容,它将每天自动发送到您的邮箱,请单击此处
为抓取和下载图片三网站个图片搜索结果。
首先,通过在爬网过程中遇到的问题,总结如下:
1、一次网站上加载在页面上的图片数量是可变的,并且每次翻页时都会刷新。对于具有大量数据的爬网程序,几乎所有人都需要使用翻页功能,有以下两种方法:
1)通过网站上的URL刷新,例如Bing Pictures:
url = 'http://cn.bing.com/images/async?q={0}&first={1}&count=35&relp=35&lostate=r
&mmasync=1&dgState=x*175_y*848_h*199_c*1_i*106_r*0'
1
2
2)使用硒来模拟鼠标操作来翻页,这将在Google图像抓取中进行说明。
2、每个网站应用程序都有不同的图片加载技术。对于静态加载的图片网站,抓取图片非常容易,因为每张图片的网址都直接显示在网页的源代码中。查找每个图片可以使用urlretrieve()下载与图片相对应的url。但是,对于动态加载的网站,它更加复杂,并且需要对特定问题进行特定分析。例如,Google图片每次都会加载35张图片(只能获得35张图片的网址)。滚动一次时,网页不会刷新,但会再次加载一批图片,并将它们与先前加载的图片一起显示在网页的源代码中。对于动态加载的网站,我建议使用selenium库进行爬网。
基本上,抓取图像的过程如下(对于网站来说,它可以通过URL翻页或不需要翻页):
1.找到抓取图片所需的网站。 (以Bing为例)
2.使用google元素检查(未使用过,将不会介绍其他内容)来查看网页的源代码。
3.使用左上角的元素检查来找到对应图像的代码。
4.通过观察找到翻页的规则(某些网站动态加载是完全不可见的,不建议使用此方法)
从图中可以看到标记div,当我们滚动页面并首先打开页面时,class ='dgControl hover'中的data-nexturl的内容将始终改变,q = binary code是的二进制表示我们的关键字。添加前缀后,我们获得了要使用的网址。
5.我们将网页的源代码放入BeautifulSoup中,代码如下:
url = 'http://cn.bing.com/images/async?q={0}&first={1}&count=35&relp=35&lostate=r&mmasync=1&dgState=x*175_y*848_h*199_c*1_i*106_r*0' agent = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.165063 Safari/537.36 AppEngine-Google."}
page1 = urllib.request.Request(url.format(InputData, i*35+1), headers=agent)
page = urllib.request.urlopen(page1)
soup = BeautifulSoup(page.read(), 'html.parser')
1
2
3
4
5
我们得到的汤是“ bs 4. BeautifulSoup”类对象,可以直接对其进行操作,并且可以自己搜索特定内容。
首先选择所需网址所在的类,如下所示:
波浪线是我们需要的网址。
我们从以下代码中获得所需的网址:
if not os.path.exists("./" + word):#创建文件夹 os.mkdir('./' + word) for StepOne in soup.select('.mimg'):
link=StepOne.attrs['src']#将得到的转化为字典形式并取src对应的value。 count = len(os.listdir('./' + word)) + 1 SaveImage(link,word,count)#调用函数保存得到的图片。
1
2
3
4
5
6
7
最后调用urlretrieve()函数下载我们得到的图像URL,代码如下:
try:
time.sleep(0.2)
urllib.request.urlretrieve(link,'./'+InputData+'/'+str(count)+'.jpg') except urllib.error.HTTPError as urllib_err:
print(urllib_err) except Exception as err:
time.sleep(1)
print(err)
print("产生未知错误,放弃保存") else:
print("图+1,已有" + str(count) + "张图")
1
2
3
4
5
6
7
8
9
10
11
这里需要强调的是,除了错误测试外,打开URL和当前下载的图片都需要使用try,否则,程序在发生错误时很容易崩溃,这极大地浪费了数据时间采集。