爬虫笔记第1、2章
最近在学python爬虫,虽然之前断断续续学了几次,但老是坚持不下来,目前参考b站的一个视频课程, 感觉讲的还不错,既有理论又有实践。
链接放在这里了: 2020年Python爬虫全套课程.
本文为系列笔记s1,希望督促自己坚持下来学习。
注:源视频有代码和笔记, 链接为: 路飞学城.
第1章 爬虫开发-爬虫基础简介
https加密算法
第2章 爬虫开发-requests模块学习
爬虫整体的使用流程/编码流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
第一段代码:
#导包
import requests
if __name__ =='__main__':
#step_1:指定url
url = 'https://www.sogou.com/'
#step_2:发起请求:发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=url)
# step_3:获取响应数据:通过调用响应对象的text属性,
# 返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
print(page_text)
#step_4:持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据完毕!!!')
此代码注意几点,1、代码if __name__ =='__main__':
可以不要;2、get方法,依据指定的url进行获取该链接的全部内容;3、.text
方法获得对象的属性;4、with open函数写入并存储。
requests案例实战
1 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
import requests
#指定搜索关键字
word = input('enter a word you want to search:')
#自定义请求头信息:UA伪装,将包含了User-Agent的字典作用到请求方法的headers参数中即可
# UA伪装
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
#指定url,原始url可能是https://www.sogou.com/web?query=撩妹,发现该url携带了参数
url = 'https://www.sogou.com/web'
#封装get请求参数:如果请求携带了参数,则可以将参数封装到字典中结合这requests请求方法中的data/params参数进行url参数的处理
#将word封装到param中。
param = {
'query':word
}
#发起请求
response = requests.get(url=url,params=param,headers=headers)
#获取响应数据
page_text = response.text
#持久化存储
fileName = word+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName+"写入successful")
2 需求:破解百度翻译
import requests
import json
word = input('enter a English word:')
#自定义请求头信息:UA伪装,将包含了User-Agent的字典作用到请求方法的headers参数中即可
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
#指定url,原始url可能是https://www.sogou.com/web?query=撩妹,发现该url携带了参数
url = 'https://fanyi.baidu.com/sug'#这个链接怎么来的?查看网页思考其为ajex响应,故观察network ->XHR的sug,获取链接。
#封装post请求参数:如果请求携带了参数,则可以将参数封装到字典中结合这requests请求方法中的data/params参数进行url参数的处理
data = {
'kw':word
}
#发起请求
response = requests.post(url=url,data=data,headers=headers)
#获取响应数据:如果响应回来的数据为json,则可以直接调用响应对象的json方法获取json对象数据。观察响应头的Content-Type
json_data = response.json() #获得字典字段。
print(json_data)
fileName = word+'.json'
fp = open(fileName,'w',encoding='utf-8')
#存储
json.dump(json_data,fp,ensure_ascii=False)
3 爬取豆瓣电影分类排行榜中的电影详情数据
# 先看请求的general 然后看最下面的参数。
# Content-Type: application/json; charset=utf-8
import requests
import json
if __name__ == "__main__":
#指定ajax-get请求的url(通过抓包进行获取)
url = 'https://movie.douban.com/j/chart/top_list?'
#定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
#定制get请求携带的参数(从抓包工具中获取)
param = {
'type':'5',
'interval_id':'100:90',
'action':'',
'start':'0',
'limit':'20'
}
#发起get请求,获取响应对象
response = requests.get(url=url,headers=headers,params=param)
#获取响应内容
json_data = response.json()
fp = open('./douban.json', 'w', encoding='utf-8')
# 存储
json.dump(json_data, fp=fp, ensure_ascii=False)
4 爬取肯德基餐厅查询中指定地点的餐厅数据
# 在http://www.kfc.com.cn/kfccda/storelist/index.aspx中输入南京进行查询
# 搜索栏网址不变,说明是进行了Ajax请求。
import requests
import json
if __name__ == '__main__':
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
# UA 伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
# 处理url 携带的参数:封装到字典
kw = input('输入要爬取的网页关键词:')
data = {
'cname': '',
'pid': '',
'keyword': kw,
'pageIndex': '1',
'pageSize': '10',
}
# 对指定的url 发起的请求对应的url 是携带参数的,并且求情过程中处理了参数
response = requests.post(url=url, data=data, headers=headers)
# 获取类型是test
page_text = response.text
fileName = kw + '.txt'
with open(fileName, 'w', encoding='utf-8') as pf:
pf.write(page_text)
print(fileName, '保存ok')
5 爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
# http://scxk.nmpa.gov.cn:81/xk/ 药监局链接
import requests
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
all_data_list = []
all_id_list = []
for page in range(1,3):
data = {
'on': 'true','page': str(page),
'pageSize': '15','productName':'',
'conditionType': '1','applyname':'','applysn':''
}
json_text = requests.post(url=url,data=data,headers=headers).json() # data 要注意,从原网页来查看!!!
for dict in json_text['list']:
id = dict['ID']#用于二级页面数据获取
#下列详情信息可以在二级页面中获取
# name = dict['EPS_NAME'] # product = dict['PRODUCT_SN'] # man_name = dict['QF_MANAGER_NAME']
# d1 = dict['XC_DATE'] # d2 = dict['XK_DATE']
all_id_list.append(id) #获取所有企业的ID
#该url是一个ajax的post请求
post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in all_id_list:
post_data = {
'id':id
} # id结合链接进行获取企业详情数据。
response_json = requests.post(url=post_url,data=post_data,headers=headers).json()
all_data_list.append(response_json)
fp = open('./allData.json', 'w', encoding='utf-8')
json.dump(all_data_list, fp=fp, ensure_ascii=False)
在学习过程中需要注意几点,第一仔细分析网页F12键,看需要采集的数据是什么格式?text 还是json,看network里面的参数,看地址栏是否发生改变。