python菜鸟爬虫技巧

环境配置安装

  1. 首先去官网python下载好python。
    下载完毕后win+R,输入cmd命令,在终端下输入python -V出现如下信息表示安装成功。
  2. 输入命令pip install -i https://pypi.tuna.tsinghua.edu/simple requests安装清华园request包。
    安装成功后,把request换成lxml 安装lxml包。
    同时PC环境变量中PATH路径添加好相关环境变量(两个,包括python和python script)

代码编写

  1. 进入PyCharm编辑器,编写代码。进入浏览器,选择你想要爬取的网页,打开开发者工具,选择
    网络(Network) —> 请求标头(Request Headers) —>User-Agent
  2. 把相关信息在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站的加密措施很好,这样简陋的代码只能获取如下信息:

  1. 网页源代码是字符串,且很多很杂无法提取数据,导入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菜鸟爬虫技巧