爬虫流程
爬虫流程:获取网页内容 --> 解析网页内容 --> 储存或分析数据
爬虫规则:
1、不要爬取公民隐私数据
2、不要爬取受著作保护的内容
3、不要爬取国家事务、国防建设、尖端科学计数领域的计算机系统等
4、请求数量和频率不能太高,否则可能无异于DDos攻击(DDos攻击就是通过给服务器发送海量高频的请求,让网站资源被耗尽,无法服务其他正常用户)
5、网站如果明显做了反爬限制,比如有些内容要登录后才能查看,或者是有验证码等限制机器的机制,就不要去强行突破
6、可以通过查看网站的robots.txt文件,了解可爬取的网页路径范围,这个文件会指明那些网页允许被爬取,哪些不允许被爬取。有些还会专门列出针对搜索引擎爬虫的许可范围
HTTP请求和响应
HTTP(Hypertext Transfer Protocol 超文本传输协议)是一种客户端和服务器之间的请求-响应协议
请求和响应格式,可以参考我之前写的博客:Http请求协议包和Http响应协议包_http请求包_丘桔的博客-CSDN博客
用Python Requests发送请求
安装Python Requests库:
pip install requests #这句要在cmd中运行
使用 requests库:
import requests
head = {"User-Agent":"Mozilla/5.0(Windows NT 10.0; Win64; x64)"}
response = requests.get("http://books.toscrape.com/", headers = head)
if response.ok:
print(response.text)
else:
print("请求失败")
补充:传入headers可以帮我们把爬虫程序,伪装成正常浏览器。我们正常用浏览器访问网页时,浏览器会发送get请求,并且请求头的User-Agent会自动带有浏览器的类型、版本、电脑操作系统等,用代码发送请求的话,就不会带有这些浏览器相关信息,服务器可以通过这点判断进来的请求是来自浏览器还是程序。有些网站只想服务真正的用户,所以会根据User-Agent拒绝来自程序的请求。这种时候,可以用过篡改headers的User-Agent属性,把代码发送的请求,伪装成浏览器的请求。
运行结果:
response.text属性的返回结果是网页的源码
用Python Requests拿到豆瓣源码
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 SE 2.X MetaSr 1.0"
}
response = requests.get("https://movie.douban.com/top250", headers = headers)
print(response.text)
用Beautiful Soup解析HTML
安装Beautiful Soup:
pip install bs4
找出books.toscrape网站中所有的价格:
from bs4 import BeautifulSoup
import requests
content = requests.get("http://books.toscrape.com/").text
soup = BeautifulSoup(content,"html.parser")
all_price = soup.findAll("p",attrs={"class": "price_color"}) #找出所有class="price_color"的p标签,返回的是一个数组
for price in all_price:
print(price.string[2:]) #从下标为2开始截取,原来的£51.77,截取之后变成51.77
找出books.toscrape网站中所有的书名:
from bs4 import BeautifulSoup
import requests
content = requests.get("http://books.toscrape.com/").text
soup = BeautifulSoup(content,"html.parser")
all_h3 = soup.findAll("h3") #找到所有的h3标签
for h3 in all_h3:
title_a = h3.find("a") #find("a")是返回第一个a标签,因为每个h3里面只有一个a标签,就不需要用findAll()了
print(title_a.string) #返回标签中的字符串
获取豆瓣电影top250的所有标题
from bs4 import BeautifulSoup
import requests
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 SE 2.X MetaSr 1.0"
}
for start_num in range(0,250,25):
content = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers = header).text
soup = BeautifulSoup(content,"html.parser")
all_hd = soup.findAll("div",attrs={"class":"hd"})
for hd in all_hd:
hd_span = hd.find("span")
print(hd_span.string)