整了这么久,终于轮到爬虫了,之前一直对爬虫有所向往,现在学起来也是觉得很有意思,主要是通过一些大佬的博客来学习的,以下是我学习爬虫的学习笔记。
安装request:
python本身提供的urllib没有python社区的requests库好用,现在主流都是用request来制作爬虫
pip install requests
安装BeautifulSoup4:
有了requests模块,可以使用他的get()方法来下载网页,但是下载的是网页的源代码,不利于信息的检索,所以有这个库来对其解析
pip install bs4
爬取网页有几个步骤
requests的get方法
来发起请求,返回响应对象import requests
u="https://www.baidu.com/"
response=requests.get(url=u)
response.encoding = "utf-8"
page=response.text
查看到response的形式是这个,所以要用.text来把他转化成文本格式
with open("baidu.html","w",encoding="utf-8") as f:
f.write(page)
然后发现文件夹里就多了一个baidu的html文件
我们使用百度搜索一个东西,比如搜素爬虫,用上一个爬虫的方法不能爬取这个,要爬取动态页面,要给爬虫一个header
找到这个user-agent,这个是给服务器说明访问的浏览器的信息(可以理解为一个身份证)
在爬虫文件中创建一个字典
idcard={
'User-Agent':'xxxxxxxxxxxxxxxxxxxxxxxxxx'}
在调用get()
方法的时候给他一个headers
属性,内容是刚刚创建的字典
然后剩下的操作还是看那四部
import requests
url="https://www.baidu.com/s?wd=爬虫"
idcard={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
response=requests.get(url=url,headers=idcard) # 给他headers属性
file=response.text
with open ("wd.html","w",encoding='utf-8') as wd:
wd.write(file)
发现文件中有wd.html文件了,打开就是搜索爬虫得到的网页了
xpath是XML的路径语言,常与lxml库一起来解析网站
完整详解这个博客中有比较详细介绍
下面介绍我的学习思路
控制台pip install lxml
没啥好说的
import requests
from lxml import etree
通过etree.HTML()
来解析网站,把网页数据解析
url='https://www.bilibili.com/'
header={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
response=requests.get(url=url,headers=header).text
tree=etree.HTML(response)
leaf=tree.xpath('//div[@id="primaryChannelMenu"]/span/div[2]/a/span/text()')
这时候print(leaf)
就有结果了
返回了一个列表,里面成功爬取了分类
我自己的语法理解:
属性
就用@属性名
//标签名[@属性名="xxx"]
/text()
如/a/span/text()/@属性名
如/a/@href标签名[排序数字]
来选择例如div[1],这个排列数字是从1开始的,意思是第几个从根部开始,一级一级的找到了‘动画’
xpath就可以写成:
/html/body/div[2]/div/div[1]/div[3]/div/div[2]/span[1]/div/a/span/text()
div[2]表示的是同级下第二个div,因为上面的svg标签里还有个div标签
优化写法:
因为我只要爬取这里的分类标签,所以:
//div[@id=“primaryChannelMenu”]/span[1]/div/a/span/text()
这里只爬取了第一个“动画”,要爬取全部分类还得改一下
这里有一排span标签,每一个都是一个分类,要把他里面的所以分类名爬取出来,我们就不要给span排列数字了,让他全选中
leaf=tree.xpath('//div[@id="primaryChannelMenu"]/span/div[2]/a/span/text()')
成功!!!
这个网站很简单,结构都很简单,爬取里面的图片
先附上完整的代码
import requests
from lxml import etree
url="https://www.qqtn.com/article/article_292075_1.html"
header={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
response=requests.get(url=url,headers=header).text
tree=etree.HTML(response)
leaf=tree.xpath('//div[@id="zoom"]/p/img/@src')
for i in leaf:
a=requests.get(url=i,headers=header).content
name=i.split("/")[-1]
with open(name,"wb") as f:
f.write(a)
详解如下
import requests
from lxml import etree
url="https://www.qqtn.com/article/article_292075_1.html"
header={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
response=requests.get(url=url,headers=header).text
tree=etree.HTML(response)
leaf=tree.xpath('//div[@id="zoom"]/p/img/@src')
图片是id="zoom"的div
里面的,所以可以双斜杠直接跳到这,发现第一个p没有图片而是文字介绍,不过没关系,第二个开始的p开始才有img标签
,所以直接这样写可以忽略掉第一个p,最后选择img标签里的src属性
这个时候直打印leaf出来的是图片的地址的列表
我们要提取里面的图片并保存,就遍历这个列表,每次循环将图片保存下来
for i in leaf:
a=requests.get(url=i,headers=header).content
name=i.split("/")[-1]
with open(name,"wb") as f:
f.write(a)
i
都是地址,所以我们继续用requests.get()方法来爬取图片网站,爬取下来要用二进制的形式来保存,就是加上.content
(图片,视频,音频都是要用二进制来爬取的,要爬取文字就用.text)https://pic.qqtn.com/up/2020-3/15847100617620054.jpg
最后是xxxx.jpg,所以我们用字符串的切片split()以"/"来对地址切片,选择倒数第一片就是xxxx.jpg了