常用模块:
import requests
import lxml
import urllib
from lxml import etree
from bs4 import BeautifulSoup
模块安装:
pip install requests
pip install lxml
pip install bs4
案例1:
import requests
#指定url
url = 'https://www.sogou.com/'
#发起请求 get方式返回值为响应对象
response = requests.get(url)
#获取响应数据
#text是返回字符串形式的响应数据,
#其他格式还有json()将获取的字符串形式的数据转换成字典
#content()返回的是二进制形式的响应数据
page_text = response.text
#数据存储
with open('sougou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
案例2:
#get请求 带入参
import requests
keyWord = input('enter a key word:')
#增加user_agent模拟浏览器 规避反扒机制
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}
params = {
'query':keyWord
}
url = 'https://www.sogou.com/web'
response = requests.get(url=url,params=params,headers=headers)
#设置编码格式
response.encoding = 'utf-8'
page_text = response.text
filename = keyWord + '.html'
with open (filename,'w',encoding='utf-8') as fp:
fp.write(page_text)
案例3:
#豆瓣电影评分
import requests
# url = 'https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action='
url = 'https://movie.douban.com/j/chart/top_list'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}
#参数内容可以做修改
params = {
'type': 5,
'interval_id': '100:90',
'action': '',
'start': 0,
'limit': 20
}
response = requests.get(url=url,params=params,headers=headers)
#json 将获取的字符串形式的数据转换成字典
page_text = response.json()
for movie in page_text:
name = movie['title']
score = movie['score']
print(name,score)
'''
动态加载
我们使用requests模块爬取数据 无法每次都实现可见即可得
有些数据是通过非浏览器地址栏url请求到的数据,而是其他请求到的数据,那么这些通过其他请求到的数据就是动态加载的数据
如何检测网页存在动态加载
通过抓包工具范围搜索
如何获取动态加载数据
全局搜索
思考:
基于抓包工具进行全局搜索不一定可以每次都能定位到动态加载数据对应的数据包?
如果动态加载的数据是经过加密的密文数据
'''
案例4:
#分页爬取
import requests
# url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}
#多页操作 修改pageSize值 或者修改pageIndex值
for page in range(1,10):
data = {
'cname': '安庆',
'pid': '',
'keyword': '安庆',
'pageIndex': str(page),
'pageSize': '10'
}
response = requests.post(url=url,headers=headers,data=data)
response = response.json()
for adds in response['Table1']:
print(adds['storeName'],adds['addressDetail'])
'''
分析:
在录入关键字的文本框中录入关键字按下搜索按钮,发起的是一个ajax请求
当前页面刷新出来的数据信息一定是通过ajax请求请求到的数据
基于抓包工具定位到的ajax请求的数据包获取对应的数据信息
url
method
data
response
'''