目录
(一)入门--豆瓣
一、学前要求知识
- python基础
- 前端基础
二、目标
要爬的网站是豆瓣电影 Top 250 (douban.com)
这是不少人踏上爬虫之路的第一个网站,现在让我们来迈出爬虫的第一步吧!
三、什么是爬虫
简单来说:爬虫就是用机器来模拟人浏览网页的过程。
四、爬取网页
使用python来爬虫,需要借助一个库,这个库不是python自带的,所以需要下载,下载方式就跟正常下载库的方法一样。
导入该库,就不在话下了吧!
在正式爬取网页前,我们需要了解,平时我们浏览网页的过程实际上就是向浏览器发起请求的过程。而请求又分很多种,最常见的为GET和POST请求,在这里我们暂时不解释GET和POST的区别。
我们要爬取豆瓣250时,当然也要知道豆瓣250的请求方式,我们用浏览器进入豆瓣250,然后按F12或者点击鼠标右键进入开发者模式,然后点击上方的网络,或者是英文 Network。
然后刷新页面,发现突然出现了一大堆,不要慌,这个就是我们在发送请求时,服务器和客户端进行网络传输发送与接收的数据包,随便点击一个,出现一个框框,然后点击框框上方的预览或者英文Preview,会大致明白这个数据包传输的是什么数据。
最终找到了传输的数据对我们有用的数据包,再点回标头或者英文Headers,会在常规内看见请求方式的字样,后面跟着的就是该数据包的请求方式,豆瓣250的请求方式则是GET。等等先不要关闭开发者模式,我们再往下看还有一个请求标头,那这是什么啊?这个对于爬虫来讲是一层障碍,因为有些网站它会检查请求头,以此来判断是爬虫还是正常访问。在爬取网页时,一般都要加一个user-agent,以防网页有轻微的反爬操作,就导致该爬虫不能使用了。接着再点击响应或者英文Response,这就是服务器发送数据,即响应正文。那么进行爬虫的前期准备就完成了。(通常你对哪个链接发送的请求,请求信息就在哪个数据包内)
import requests
url = f'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64',
}
html = requests.get(url, headers=headers)
web_page = html.text
因为是GET请求,所以要用requests的get方法。打印html,会发现它是Response对象,它有一个text方法,会获取该请求的数据信息,我们打印web_page,发现打印的结果是html源码也就是该数据包的响应正文。那么我们也完成了一次爬取。但是爬取出来的数据好像用处不大,这样的数据还不如正常访问网站的用处大,那么爬虫的用处也完全没有嘛。但是,爬虫还有一个重要的环节,那就是清洗数据,一个网页上的数据肯定是有一点对我们有用,大部分对我们用处不大,所以需要将有用的数据清洗出来。
五、解析网页
下面要清洗网页上的数据,这一过程叫网页解析。
解析网页一般有两种方法:
- 正则匹配(也就是python中re库)正则表达式,re,Python,正则表达式实例;
- Xpath。
今天我使用xpath来解析网页。
在python中使用xpath,需要下载lxml解析库。
pip install lxml
使用前需要先将html源码实例化成etree对象。
from lxml import etree
movie = etree.HTML(web_page)
接着使用etree对象的xpath属性,然后写入要匹配的路径即可。(成块爬取,将一个电影的所有信息先爬下来,然后在爬需要的信息,这样爬取的信息才一定会匹配。)
movies = middle.xpath('//*[@class="item"]')
for movie in movies:
rank = movie.xpath('.//em/text()')[0]
title = movie.xpath('.//span[1]/text()')[0]
score = movie.xpath('.//*[@class="rating_num"]/text()')[0]
print(f'排名:{rank},电影名:{title},评分:{score}')
这样就完成数据的清洗。
六、翻页
聪明的你肯定发现我们只爬到了一页数据。
那么怎么爬取豆瓣250的所有数据呢,我们先不着急写代码,先翻在浏览器上翻上几页观察url(网址)的变化,发现url后面的start,每次都加25。你是不是想到了怎么爬取所有的数据,等等先不要着急,再试下第一页是否符合该规律,因为有些网址的第一页会与后面的没有规律,当然豆瓣250是符合规律的。
八、代码
import requests
from lxml import etree
total_page = 10
for page in range(0, total_page * 25, 25):
url = f'https://movie.douban.com/top250?start={page}&filter='
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64',
}
html = requests.get(url, headers=headers)
web_page = html.text
middle = etree.HTML(web_page)
movies = middle.xpath('//*[@class="item"]')
for movie in movies:
rank = movie.xpath('.//em/text()')[0]
title = movie.xpath('.//span[1]/text()')[0]
score = movie.xpath('.//*[@class="rating_num"]/text()')[0]
print(f'排名:{rank},电影名:{title},评分:{score}')
(二)你的心,我懂得~~--彼岸图网
一、目标
要爬的网站是4K美女壁纸_高清4K美女图片_彼岸图网 (netbian.com)
需要爬到每个美女图片,并将其保存下来。
二、爬取网页
可以快速得知这个网页是get请求,于是有了以下代码:
import requests
url = 'https://pic.netbian.com/4kmeinv/'
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64',
}
html = requests.get(url, headers=headers)
web_page = html.text
打印web_page,发现打印内容是乱码。在以下的这个位置一般都会有这个网站的编码格式
web_page = html.text.encode('iso-8859-1').decode('gbk')
(前面的编码形式encode是哪个编码格式是我试出来的,一般都是utf-8。至于为什么这个是iso-8859-1,从网上搜索的答案是ISO-8859-1 是大多数浏览器默认的字符集)
这样输出的就是正常的html源码啦
由于在列表页的图片不清晰,所以需要进入详情页下载图片,发现详情页链接都在li下,但是抓取到的li中的链接只有一半,需要加上所缺失的。再浏览器中进入详情页分析缺失那一部分,多分析几个,就会发现它们缺失的是什么啦。
仔细观察网页会发现有一个特殊的图片,它不是我们想要的小姐姐,但是打印出html源码会发现它并没有出现在源码中。但是如果它出现在源码中,可以利用它多个class属性进行排除。
lis = web_html.xpath('//*[@class="slist"]//li')
base_url = 'https://pic.netbian.com'
for li in lis:
original_url = base_url + li.xpath('.//a/@href')[0]
li_class = li.xpath('./@class')
有了详情页的url后,自然是再发送一次请求进入详情页,取到图片啦~~(记得图片名也要取到哦,取图片名字是为了作为存储得文件名。同样这里的图片链接也不全,需要自己补充)
original_html = requests.get(original_url, headers=headers)
original_page = original_html.text.encode('iso-8859-1').decode('gbk')
original_page = etree.HTML(original_page)
img_name = original_page.xpath('//*[@id="img"]/img/@title')[0]
img_path = 'https://pic.netbian.com/'\
+ original_page.xpath('//*[@id="img"]/img/@src')[0]
(点击下载原图需要登录,所以这里是直接爬取的图片)
三、保存图片
首先在与爬虫文件同一级处创建一个文件夹用来保存小姐姐。
下载文档(图片是文档的一种):其实也就是向文件中写入数据
读写文件是爬虫经常使用的操作。
知识补充:IO操作:读写文件是最常见的IO操作。IO操作还包括访问网络,等待用户输入数据。IO操作相对于内存计算来说是比较慢的。
pytho