python爬虫get请求
1.get请求常见使用方法
1.1网站分类
如下图页面的每个分类,通过get请求数据
1.2网站分页
如:链家租房页面的分页
1.3搜索关键字
如:百度搜索
1.4瀑布流参数
如百度图片:不会一次性将所有图片全部显示出来,这样会给服务器造成压力,也避免客户长时间的等待,所以图片都是慢慢加载出来的
2.urllib get
2.1 url分析
我们在爬取网站之前,要对网站的大体导航链接和页面url进行分析
以无锡二手房为例分析得到:
首页base_url:https://wx.lianjia.com
(1)位置:【区域】选择滨湖,上方url为base_url + ershoufang/binhu
(2)位置:【地铁线】选择1号线,上方url为base_url + ershoufang/li4120025008033141/
(3)售价:选择第二个【40-60万】,上方url为base_url + ershoufang/p2(第一个价格区间,这里就是p1)
(4)面积:选择第三个【70-90平】,上方url为base_url + ershoufang/a3(第一个,这里就是a1)
(5)房型:选择第二个【二室】,上方url为base_url + ershoufang/l2(第一个,这里就是l1)
(6)用途:选择第二个【别墅】,上方url为base_url + ershoufang/sf3(第一个,这里就是sf1)
(7)第二页,上方url为base_url + ershoufang/pg2(第三页,这里就是pg3)
2.2 实例
需求:爬虫无锡二手房价格在40万以下的,面积在50平以下,一室的第一页二手房信息
# coding:utf-8
from urllib import request
input1 = input("是否需要查询二手房信息?输入1:代表是;输入2:代表不是>>>")
if int(input1) == 1:
input_page = input("1)第一页;2)第二页")
input_house = input("1)一室;2)二室;3)三室;4)四室>>>")
input_area = input("1)50平以下;2)50-70平;3)70-90平;4)90-120平>>>")
input_price = input("1)40万以下;2)40-60万;3)60-80万;4)80-100万>>>")
url="https://wx.lianjia.com/ershoufang/pg%sl%sa%sp%s"%(input_page,input_house,input_area,input_price)
headers = {
'Referer': 'https://wx.lianjia.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/68.0.3440.106 Safari/537.36'
}
req = request.Request(url=url,headers=headers)
response = request.urlopen(req)
result = response.read().decode()
print(result)
else:
print("输入有误,重新输入")
3.request get
3.1 request.urlretrieve
(1)下载图片我们需要借助urllib模块的request功能集当中的urlretrieve
(2)urlretrieve(url,filename,reporthook)
三个参数:
url 资源的地址
filename 资源下载到本地的路径(存放的路径)
reporthook 回调函数。当我们执行下载的时候reporthook指定的函数会自动被调用,
(3)reporthook的参数必须是函数,而且具有三个参数
第一个值是:单次下载大小
第二个值是:下载的次数
第三个值是:资源总大小
3.2 保存图片实例
from urllib import request
def loading(a,b,c):
d = a * b
result = d / c
if result >= 1:
result = 1
print(result)
request.urlretrieve(
"https://image1.ljcdn.com/320200-inspection/b878234f-a9af-46f1-b268-d79ed24389aa.JPG.296x216.jpg.437x300.jpg",
"1.jpg", #保存的图片名称
loading # 回调函数loading,必须有三个参数
)
4.百度图片爬取
4.1 分析请求数据
(1)请求的格式都为json格式,百度图片应该是用ajax动态加载图片,而ajax传输数据的方式通常是json
(2)继续查看acjson包的header信息。发现parameter参数,通过对比。我们在滑动页面时,图片一直在加载,pn值也一直在变。
我们做出如下总结:
Pn是当前的条数封顶
Rn是单次加载的条数,通俗的来说就是每次请求都加载30条
第一次请求:Pn = 30,Rn = 30,得到的图片 0-30张
第二次请求:Pn = 60,Rn = 30,得到的图片 30-60张
4.2案例:爬取150张图片
# coding:utf-8
import requests
from urllib import request
url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj" \
"&ct=201326592&is=&fp=result&queryWord=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87&cl=2" \
"&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87" \ "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&pn=30&rn=30&gsm=1e&1538101746698="
headers = {
'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1538101739459_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
parameter_list = []
num_list = [30,60,90,120,150]
for num in num_list:
parameter = {
'tn':'resultjson_com',
'ipn':'rj',
'ct':'201326592',
'is':'',
'fp':'result',
'queryWord':'王俊凯图片',
'cl':'2',
'lm':'-1',
'ie':'utf-8',
'oe':'utf-8',
'adpicid':'',
'st':'-1',
'z':'',
'ic':'0',
'word':'王俊凯图片',
's':'',
'se':'',
'tab':'',
'width':'',
'height':'',
'face':'0',
'istype':'2',
'qc':'',
'nc':'1',
'fr':'',
'expermode':'',
'pn':num,
'rn':'30',
'gsm':'1e',
'1538101746698':''
}
parameter_list.append(parameter)
for parameter in parameter_list:
response = requests.get(url=url,params=parameter,headers=headers)
content = response.json().get("data")
for data in content:
image_url = data.get("middleURL")
if type(image_url) == str:
image_name = image_url.split("/")[5]
request.urlretrieve(image_url,"E://karrywang/%s"%image_name)
如图:150张图片成功爬取