整理一下今天学习的内容,因为在以后的数据分析行业中会用到数据采集,所以打算花一段时间来学习爬虫。
可能是因为不太会,感觉很多网站的反爬机制都在不断的更新…
1.request是常用的爬虫包,首先获取一个简单的html页面
import requests
url='https://www.baidu.com/'
response=requests.get(url=url)
page_text=response.text
with open('./taobao.html','w',encoding='utf-8') as fp:
fp.write(page_text)
- 在爬虫中正常的访问请求指的是通过真实的浏览器发起的访问请求
- 异常的访问请求,通过非浏览器发起的请求(爬虫程序模拟的请求)
word=input('enter a word:')
url='https://www.baidu.com/'
#UA伪装
headers={
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#将伪装的UA作用到了请求的请求头中
response=requests.get(url=url,headers=headers)
page_text=response.text
print(page_text)
上面的代码就实现了UA伪装。
下面举一个从豆瓣爬取电影名称及电影评分的例子,爬取的豆瓣电影界面如下(部分):
其中需要爬取的豆瓣电影名称和评分就属于动态数据。
# word=input('enter a word:')
url='https://movie.douban.com/j/search_subjects'
# ?type=movie&tag=%E7%A7%91%E5%B9%BB&sort=recommend&page_limit=20&page_start=0
#参数动态化
params={
"type": "movie",
"tag": "科幻",
"sort": "recommend",
"page_limit": "100",
"page_start": "0",
}
#将伪装的UA作用到了请求的请求头中
headers={
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
response=requests.get(url=url,headers=headers,params=params)
page_text=response.json()#json返回的是序列好的对象
# page_text
#将电影名称和评分进行解析
for dict in page_text['subjects']:
name = dict['title']
rate = dict['rate']
print(name+":"+rate)
上面的代码输出结果如下图:
在这里还涉及到一个使用python读取嵌套json数组的问题,因为page_text的输出形式如下(部分):
可以看到page_text的输出是一个多层嵌套的json形式,于是在这里可以使用下面的代码获取page_text里面的内容:
for dict in page_text['subjects']:
name = dict['title']
rate = dict['rate']
print(name+":"+rate)
也可以采用jsonpath的方式获取,方式如下:
# json处理嵌套数组
import jsonpath
for dict in page_text['subjects']:
name=jsonpath.jsonpath(dict,'$..title')
rate=jsonpath.jsonpath(dict,'$..rate')
print(name,rate)
输出如下图(部分):
两种方式都可以读取到json嵌套形式中的数据。
下面再介绍一个肯德基餐厅查询
肯德基餐厅信息查询界面如下图所示
在这里爬取北京所有KFC餐厅的信息,因为页面内显示北京餐厅信息有8页,所以设置for循环,代码如下:
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
for pageNum in range(1,8):
data={
"cname": "",
"pid": "",
"keyword": "北京",
"pageIndex": str(pageNum),
"pageSize": "10",
}
#参数data是用来实现参数动态化,等同于get方法中的params参数的作用
response = requests.post(url=url,headers=headers,data=data)
page_text = response.json()
for dic in page_text['Table1']:
pos = dic['addressDetail']
print(pos)
首先要找到图片的链接,下面分别使用requests和urllib获取图片:
#requests
url='http://pic.sc.chinaz.com/files/pic/pic9/202002/zzpic23387.jpg'
response = requests.get(url=url,headers=headers)
img_data = response.content #content返回的是bytes类型的相应数据
with open('./123.png','wb') as fp:
fp.write(img_data)
#urllib
from urllib import request
utl = 'http://pic.sc.chinaz.com/files/pic/pic9/202002/zzpic23387.jpg'
request.urlretrieve(url=url,filename='./456.png')
将图片另存为,在存储的位置打开就可以看到爬取下来的图片,两种图片爬取方式的主要区别在于 requests的方式可以实现UA伪装,而urllib无法实现UA伪装。
今天就学习到这里了,明天也要继续加油啊…
(半个月之前投的携程简历发了笔试链接,果然还是不能提前批呀,好好准备笔试吧,本来以为都凉了…没有完成4月之前找到实习的计划,继续加油吧。)