python菜鸟爬虫技巧
环境配置安装
- 首先去官网python下载好python。
下载完毕后win+R,输入cmd命令,在终端下输入python -V出现如下信息表示安装成功。
- 输入命令
pip install -i https://pypi.tuna.tsinghua.edu/simple requests
安装清华园request包。
安装成功后,把request换成lxml 安装lxml包。
同时PC环境变量中PATH路径添加好相关环境变量(两个,包括python和python script)
代码编写
- 进入PyCharm编辑器,编写代码。进入浏览器,选择你想要爬取的网页,打开开发者工具,选择
网络(Network) —> 请求标头(Request Headers) —>User-Agent
- 把相关信息在PyCharm中输入,可以在控制台获得你想要的信息。
代码:
import requests
url='https://www.bilibili/'
#应对反爬措施:添加请求头
header = {
#浏览器的标识
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
response=requests.get(url,headers = header)
#response.status_code 状态码(控制台显示200代表连接成功,404页面找不到)
print(response.status_code)
print(response.text)
B站的加密措施很好,这样简陋的代码只能获取如下信息:
- 网页源代码是字符串,且很多很杂无法提取数据,导入lxml包调用lxml方法可以把它转换成对象(对象有属性有方法)用方法提取。
#提取想要数据需要使用lxml ,直接引用lxml模块下的etree
from lxml import etree
obj = etree.HTML(response.text)
print(obj)
可以看到控制台输出了如下信息:
得到的该对象说明网页元素存储在计算机这块地址中。接下来开发者工具选择Elements选项,这里有很多HTML语言,我们把鼠标悬停在上面层次的搜索(一般head跳过在body找),获取我们想要的板块内容。在里面一层一层的寻找div,最后print求一下最后一层div的长度,检查是否层次书写正确。控制台返回len得到的值为12。
#用xpath解析器解析网页元素
item=obj.xpath('.//body/div[2]/div[1]/div[2]/div[1]/div[2]/div')
print(len(item))
控制台输出了12:
而开发者工具显示该层次中div的数量的确是12个,说明书写正确。
另外,我们可以引用标签的id进行更简便的搜查,而不是死板的从最外层开始逐个书写目录,这样费时又费力。代码如下:
item1=obj.xpath('.//div[@id="reportFirst1"]/div[2]/div')
print(len(item1))
控制台一样可以返回正确的len长度:
4. 接下来就是爬取这一层div中我们需要的标题和播放量信息了。鼠标悬停在当前层的div中我们可以看到信息区域被标记出来。
左上角细节:div 的class名称被标记出来(下图)
接下来继续层次的向里面查找,直到看见这一栏信息:
宏观大图:
在最内层div中,有两个p标签分别记录了我们想要的信息。接下来在代码中实现:
print("阿B主页标题和播放")
for i in item:
try:
c=i.xpath('./div[1]/a/div/p[@class="title"]')[0].text
print(c)
except:
pass
try:
d=i.xpath('./div[1]/a/div/p[@class="play"]')[0].text
print(d)
except:
pass
print("-----------------")
运行如下:
代码中抓取和捕获异常是必要的,因为并不是所有的信息都用p标签封装起来。这也是补充代码的健壮性。
控制台后面多输出了两条重复横线就是因为某些异常捕获后跳过了,可能是某些标签不是p标签因此抓取失败导致的。
完整源码:
import requests
import lxml
url='https://www.bilibili/'
#应对反爬措施:添加请求头
header = {
#浏览器的标识
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
response=requests.get(url,headers = header)
#response.status_code 状态码(控制台显示200代表连接成功,404页面找不到)
print(response.status_code)
print(response.text)
#提取想要数据 lxml ,直接引用lxml模块下的etree
#网页源代码是字符串,很多很杂无法提取数据,可以把它转换成对象(对象有属性有方法)用方法提取
from lxml import etree
obj = etree.HTML(response.text)
print(obj)
#用xpath解析器解析网页元素
item=obj.xpath('.//body/div[2]/div[1]/div[2]/div[1]/div[2]/div')
print(len(item))
item1=obj.xpath('.//div[@id="reportFirst1"]/div[2]/div')
print(len(item1))
print("阿B主页标题和播放")
for i in item:
try:
c=i.xpath('./div[1]/a/div/p[@class="title"]')[0].text
print(c)
except:
pass
try:
d=i.xpath('./div[1]/a/div/p[@class="play"]')[0].text
print(d)
except:
pass
print("-----------------")
——Seina—2020/7/8
更多推荐
Python菜鸟爬虫技巧
发布评论