Python爬虫之web内容获取:
-
一:简单的向服务器发送请求方式:
# -- coding:utf-8 --import urllib2向指定的url 发送请求,并返回响应的类文件对象response = urllib2.urlopen("http://www.baidu.com")服务器返回的对象支持python文件对象的方法read()方法:读取文件的全部类容,返回字符串html = response.read()print html
但这样的方式往往容易被反爬虫者发现,因此我们需要进一步的伪装。
-
反爬虫第一步:
首先,我们需要了解浏览器在向服务器发送请求时做了什么:这里我们可以用Fiddler抓包工具来实现下载安装配置好Fiddler(具体配置方法)后,当我们浏览器端向服务器发送请求时(如在浏览器访问),在Fiddler抓包工具抓到的文件中对应的百度链接的文件所对应的此处便能得到如下的Header请求信息。
Fiddler抓包工具Header请求信息
# 请求方式(GET / POST /...)GET https://www.baidu.com?&t=1520930345744&sid=1455_13549_21088_20928 HTTP/1.1# 指定被请求资源的Internet主机和端口号Host: www.baidu.com# 链接方式( keep-alive / close /...)Connection: keep-alive# 浏览器端可以接受的媒体类型Accept: text/plain, /; q=0.01X-Requested-With: XMLHttpRequest# User-Agent告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36Referer: https://www.baidu.com/# 览器申明自己接收的编码方法,通常指定压缩方法Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9#本地Cookie信息Cookie: BAIDUID=955895CE3A39E426AF6E5CF53F2B:FG=1; BIDUPSID=955895CE3A39E426AF53F2B;
拿到浏览器请求的Header信息后,接下来我们便可以模拟浏览器访问服务器了如下:
-
模拟get请求:
# -*- coding:utf-8 -*-from urllib import request,parseurl = "http://www.baidu.com/s"kwd = input("请输入需要查询的关键字:")wd = {"wd":kwd}#将一个字典类型的数据转化为字符串类型(url: "wd=875398%jsjdj%")wd = parse.urlencode(wd)fill_url = url + "?" + wdheader = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}#通过urllib2.Resquest()方法构造一个请求对象req = request.Request(fill_url,headers = header)#向指定的url 发送请求,并返回响应的类文件对象response = request.urlopen(req)#服务器返回的对象支持python文件对象的方法#read()方法:读取文件的全部类容,返回字符串html = response.read()print(html)
-
模拟post请求\利用本地Cookie获取需要登陆后才能获取的内容:
#!/usr/bin/python#-*- coding:utf-8 -*-from urllib import request,parse#import jsonurl = "https://mail.qq.com/cgi-bin/frame_html?t=frame_html&sid=3-L3dxbAFqMTDGY8&url=/cgi-bin/mail_list?folderid=8%26folderkey=8%26page=0%26t=mail_list_group%26ver=236935.0%26cachemod=maillist%26cacheage=7200%26r="header = { "Host": "mail.qq.com", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", "Accept": "image/webp,image/apng,image/*,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "RK=k0HCcQgeOg; pgv_pvi=4384783360; tvfe_boss_uuid=e72e765a79d2f90f; 。。。*",}req = request.Request(url,headers = header)print(request.urlopen(req).read().decode('utf-8'))
-
获取 Ajax 加载的 json 数据:
#!/usr/bin/python#-*- coding:utf-8 -*-from urllib import request,parseimport jsonurl = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}formData = { "start":"0", "limit":"5"}data = parse.urlencode(formData).encode('UTF-8')req = request.Request(url,data = data,headers = header)print(request.urlopen(req).read().decode('UTF-8'))