爬虫基础 requests基础 GET、POST

1、requests.get

requests.get一般用于发送GET请求,举例:

url = 'https://www.baidu.com/'
response = requests.get(url=url)
response.encoding = 'utf-8'
page_text = response.text
print(page_text)
# 持久化存储
with open('./baidu.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)

requests.get()一般有以下几个重要参数:

url:用来传递需要爬取的网站的url

params:用来传递GET请求地址栏需要传递的参数,形式为字典

headers:http或者https请求包含请求头,请求体等信息,headers参数用来设置GET请求头中某些参数的信息(如 user-agent等),参数形式为字典

proxies:是用来使用代理IP的,参数形式为字典,写明协议和ip地址及端口,通过代理IP地址进行网页爬取

timeout: 设置超时,如果超出这个时间网页没有响应,就报出异常,停止访问,单位为秒

网页一般都会采用UA检测,为了避免反爬,需要在请求头中进行UA伪装,UA直接在浏览器中复制即可,另外,请求头中的其他参数,也可以在定义的请求头字典中携带。GET请求方式的参数一般在地址栏中携带,所以可以通过定义params参数字典,携带地址栏中的请求参数,举例:

    url = 'https://movie.douban.com/j/new_search_subjects'
    UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0'
    headers = {
        'User-Agent': UA
    }

    param = {
        'sort': 'U',
        'range': '0,10',
        'start': 20,
    }
   proxies = {'https': '114.226.162.88:15230'}
    response = requests.get(url=url, params=param, headers=headers,proxies=proxies, timeout=10)
    response.encoding = 'utf-8'  # 避免中文乱码
    list_data = response.json()
    fp = open('./douban.json', 'w', encoding='utf-8')
    json.dump(list_data, fp=fp, ensure_ascii=False)
fp.close()
print('爬取结束')

有几点需要注意,一个是需要在浏览器中查看response headers中content type类型,然后按照相应的方式解析数据{“text/html”:'response.text', "json":'response.json()'}注意json后的括号,如果是音视频,图片,一般为二进制,需要用response.content接收数据。如果出现中文乱码的情况,需要修改一下响应的编码格式,response.encoding = 'utf-8'通常为utf8,也可能是GB2312等,试试就行了。如果响应是json数据,则进行文件写入时候,需要导入json包,然后用json.dump(data, fp=fp,ensure_ascii=False)将数据写入。如果是二进制数据,则需将文件的打开方式变为‘wb’然后以二进制方式写入数据即可。

2、requests.post

requests.post用法和requests.get类似,参数也大致相同,不同点在于POST请求的参数在请求体中,所以需要将请求携带的参数封装在字典data中。响应的处理方式和GET的响应处理方式相同,举例:

    post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0'
    headers = {
        'User-Agent': UA
    }
    kw = input("请输入城市:")
    data = {
        'cname': '',
        'pid': '',
        'keyword': kw,
        'pageIndex': '1',
        'pageSize': '10',
    }
    response = requests.post(url=post_url, data=data, headers=headers)
    response.encoding = 'utf-8'
    page_text = response.text
    page_json = json.loads(page_text)
    print(page_json)
    print(type(page_json))
    page_nums = page_json['Table'][0]['rowcount'] #json数据中包含了总餐厅数量,通过分析请求发现,每页显示10条,所以通过循环爬取所有餐厅
    
    for i in range(int(page_nums)//10):
        data = {
            'cname': '',
            'pid': '',
            'keyword': kw,
            'pageIndex': str(i+1),
            'pageSize': '10',
        }
        response = requests.post(url=post_url, data=data, headers=headers)
        response.encoding = 'utf-8'
        page_text = response.text
        page_json = json.loads(page_text)
        fp = open('./{}kfc.json'.format(kw), 'a', encoding='utf-8')
        fp.write('\n')
        json.dump(page_json, fp=fp, ensure_ascii=False)
    print('爬取结束')

 

posted @ 2021-12-10 11:36  我要学算法  阅读(714)  评论(0)    收藏  举报