1 Request简介
-
Requests
库:Requests是一款目前非常流行的http请求库,使用python编写,能非常方便的对网页Requests进行爬取,也是爬虫最常用的发起请求第三方库。- 安装:
pip install requests 或者conda安装 conda install requests
-
常用指令:
re.status_code 响应的HTTP状态码 re.text 响应内容的字符串形式 rs.content 响应内容的二进制形式 rs.encoding 响应内容的编码
-
访问百度
import requests # 发出http请求 re=requests.get("https://www.baidu.com") # 查看响应状态 print(re.status_code) #输出:200 #200就是响应的状态码,表示请求成功 #我们可以通过res.status_code的值来判断请求是否成功。
res.text 返回的是服务器响应内容的字符串形式,也就是文本内容
-
下载txt文件
import requests # 发出http请求 re = requests.get('https://apiv3.shanbay.com/codetime/articles/mnvdu') # 查看响应状态 print('网页的状态码为%s'%re.status_code) with open('鲁迅文章.txt', 'w') as file: # 将数据的字符串形式写入文件中 print('正在爬取小说') file.write(re.text)
re.txt就是网页中的内容,将内容保存到txt文件中
-
下载图片
re.text
用于文本内容的获取、下载re.content
用于图片、视频、音频等内容的获取、下载
import requests # 发出http请求 #下载图片 re=requests.get('https://img-blog.csdnimg.cn/20210424184053989.PNG') print('网页的状态码为%s'%re.status_code) # 以二进制写入的方式打开一个名为 info.jpg 的文件 with open('datawhale.png','wb') as ff: # 将数据的二进制形式写入文件中 ff.write(res.content
re.encoding 爬取内容的编码形似,常见的编码方式有 ASCII、GBK、UTF-8 等。如果用和文件编码不同的方式去解码,我们就会得到一些乱码。
2 HTML解析和提取
- 浏览器工作原理:向浏览器中输入某个网址,浏览器回向服务器发出请求,然后服务器就会作出响应。其实,服务器返回给浏览器的这个结果就是HTML代码,浏览器会根据这个HTML代码将网页解析成平时我们看到的那样
- 提取HTML:
会看到很多带有标签的信息import requests res=requests.get('https://baidu.com') print(res.text)
3 BeautifulSoup简介
- BeautifulSoup库的作用:最主要的功能是从网页抓取数据
- 安装:
pip install bs4
- 安装:
- 解析网页:豆瓣读书 Top250
import io import sys import requests from bs4 import BeautifulSoup ###运行出现乱码时可以修改编码方式 #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') ### headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } res = requests.get('https://book.douban.com/top250', headers=headers) soup = BeautifulSoup(res.text, 'lxml') print(soup)
- 思路:
- python 打印信息时会有限制 我们将打印的编码改成gb18030
- headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务
- 通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup
- 然后使用 BeautifulSoup(res.text, lxmlr’) 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象
- 解析成了 BeautifulSoup 对象可以较为方便的提取我们需要的信息
- 思路:
- 提取信息:
find()
:返回符合条件的首个数据find_all()
:返回符合条件的所有条件
import io import sys import requests from bs4 import BeautifulSoup #如果出现了乱码报错,可以修改编码形式 #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') # headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } res = requests.get('https://book.douban.com/top250', headers=headers) soup = BeautifulSoup(res.text, 'lxml') print(soup.find('a')) #<a class="nav-login" href="https://accounts.douban.com/passport/login?source=book" rel="nofollow">登录/注册</a> print(soup.find_all('a')) #返回一个列表 包含了所有的<a>标签
- 除了传入 HTML 标签名称外,BeautifulSoup 还支持熟悉的定位:
# 定位div开头 同时id为'doubanapp-tip的标签 soup.find('div', id='doubanapp-tip') # 定位a抬头 同时class为rating_nums的标签 soup.find_all('span', class_='rating_nums') #class是python中定义类的关键字,因此用class_表示HTML中的class
4 实践项目1:自如公寓数据抓取
- 思路:
- 自如公寓官网:https://wh.ziroom.com/z/z/,第1页的网页为:https://wh.ziroom.com/z/p1/,第2页的网页为:https://wh.ziroom.com/z/p2/,…第50页的网页为:https://wh.ziroom.com/z/p50/
- 房屋的信息网页为类似于:https://wh.ziroom.com/x/741955798.html,即:https://wh.ziroom.com/x/XXXX.html。有了思路,通过访问自如公寓的网站,获取每个房间后面的数字号 然后通过数字号访问房屋的直接信息,然后抓取房屋的信息保存在excel中
- 观察房屋的网页,找出需要的信息:
房屋的名称,房屋的面积,房屋的朝向,房屋的户型,房屋的位置,房屋的楼层,是否有电梯,房屋的年代,门锁情况,绿化情况 - 不知道这些信息的标签信息,不能用beautifulsoup对他们进行定位
通过百度查询,浏览器按F12时能进入源代码模式 或者 点击右键进入审查元素,点击左上角的箭头,可以定位到元素的位置
- 准备步骤:
- 导入库:
import requests from bs4 import BeautifulSoup import random import time import csv
- UA头信息:
多次访问自如的官网,只用一个UA头岂很容易被反爬虫识别,做很多个UA头,然后每次访问的时候可以随机选一个
#这里增加了很多user_agent #能一定程度能保护爬虫 user_agent = [ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131