企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 安装爬虫需要的包 ``` sudo pip install BeautifulSoup pip install requests sudo apt-get install python-lxml # 使用系统包管理器安装 ``` > 其中,BeautifulSoup是用来获取一个页面里各个标签里面的内容,我们主要用到它里面的find(),find_All()函数。具体用法在后面介绍。 requests是用来获取网页信息的,我们给它一个url,它能把这个url对应的页面信息全部反馈给我们,我们再用BeautifulSoup里的函数对它们进行处理。 lxml是一个解析器,Python里有专门的解析器,html.parser,但是lxml的解析速度更快,建议用lxml。 ## 批量爬取页面数据 我们打开[百度图片](http://image.baidu.com/search/index),在里面搜索要爬取图片的关键词,例如“杨紫”,然后敲回车。 <div align="center"><img src="images/27.png"/></div> 跳转到图片搜索结果界面,右键按**F12**,如果不行就**Fn+F12**打开开发者工具。我们将鼠标放在图片搜索结果界面(标1部分),滑动鼠标滚轮。可以看到随着滑动,标2部分不断显示加载的具体文件。 <div align="center"><img src="images/28.png"/></div> 然后我们点击这些具体文件,然后展开“**Query String Parameters**”。 <div align="center"><img src="images/31.png"/></div> 可以看到不同文件里面pn是不同的,我们在图片搜索地址中加入“**&pn=30**”,,回车。 <div align="center"><img src="images/32.png"/></div> 搜索结果是“杨紫”,如果将&pn=30替换成“**&pn=0**”,回车后会发现到我们首次搜索结果的界面。这里pn就是第几页的参数。 在图片搜索结果界面,鼠标右键**查看网页源代码**(如果你用的是谷歌浏览器)。 <div align="center"><img src="images/29.png"/></div> 然后按**Ctrl+F**,在搜索框中输入“**objURL**”。如下图红框中的就是我们要爬取的图片。 <div align="center"><img src="images/30.png"/></div> 现在我们写一个正则表达式,来快速获取所有objURL后面的图片地址,代码如下所示。 ```python pic_url = re.findall('"objURL":"(.[^\"]*?)",' html, re.S) ``` ### step1: 获取要爬取的网页的内容 导入需要的包 ```python # -*- coding:utf-8 -*- # picture.py from bs4 import BeautifulSoup import requests import re import os import sys import time ``` 主函数 ```python if __name__ == '__main__': # 主函数入口 word = raw_input("输入搜索图片关键词:") num = int(raw_input("输入最多下载多少页图片:")) li = [] li = get_page(word, num) # 爬取具体页面的图片url download_Image(li) # 下载图片到本地 ``` ### step2: 爬取具体页面的图片 <p id="color" style="color:red">我们要爬取一个页面,首先需要知道他的URL,然后发送post请求,....</p> ```python # 要抓取网页url url = "http://image.baidu.com/search/index" # 伪装浏览器 headers = { 'User-Agent':'Mozilla/5.0(Windows NT 6.3; WOW64) AppleWebKit/537.36 \ (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0' } def get_page(word, num): url1 = url + '&word=' + str(word) + '&pn=' n = 0 li = [] # 创建一个空列表 while n < num: pn = n*30 # url中的pn参数 new_url = url1 + str(pn) # 获取某个网页内容,发送Post请求 res = requests.post(new_url, headers=headers, timeout=10) content = res.content # 返回二进制响应内容 # 利用正则表达式,找出图片的url。pic_url是一个列表 pic_url = re.findall('"objURL":"(.*?)"', content, re.S) #print(pic_url) li = li + pic_url # 将多个图片url列表合成一个列表 n = n + 1 print(li) return li ``` 运行picture.py文件 ``` python picture.py ``` 按打印提示输入搜索的关键词,下载页数(根据自己情况输入)。回车后我们将得到包含图片url的列表,如下图所示。 <div align="center"><img src="images/33.png"/></div> ### 下载图片 现在来写下载图片的函数download_Image() 我们前面得到了包含图片url的列表,列表中的每个元素都是图片的url地址。我们遍历列表,然后将其url爬取,将下载的图片保存到本地就可以了。实现函数代码如下 ```python def downloadPicture(li): num = 0 path = './photo' # 图片需要保存的路径 if os.path.exists(path) == False: # 如果photo文件不存在,创建一个 os.makedirs(path) for pic_url in li: print('正在下载第 '+ str(num+1)+'张图片, 图片地址:'+str(url)) try: pic = request.post(pic_url, headers) content = pic.content else: continue except BaseException as e: print("错误, 当前图片无法下载") print('except:', e) continue else: file_name = r'img_' + str(num) + '.jpg' img_file_name = os.path.join(path, file_name) fp = open(img_file_name, 'wb') fp.write(content) fp.close() num += 1 ``` 运行程序 picture.py ``` python picture.py ``` 按照打印提示输入关键词,如“杨紫”,下载多少页,如输入“1”。 这样就爬取了百度上有关杨紫的的30张图片,并保存到了本地,如下图。 <div align="center"><img src="images/34.png"/></div>