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张图片成功爬取

猜你喜欢

转载自blog.csdn.net/qq_39620483/article/details/83039541