Python爬虫

爬虫流程

爬虫流程:获取网页内容 -->  解析网页内容 --> 储存或分析数据 

爬虫规则:

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属性,把代码发送的请求,伪装成浏览器的请求。

运行结果:

Python爬虫_第1张图片

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)

你可能感兴趣的:(python,爬虫,开发语言)