爬虫基础 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('爬取结束')

浙公网安备 33010602011771号