爬取数据


这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。


1. 最基本的爬取


抓取大多数情况属于get请求,即直接从对方服务器上获取数据。


首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。


import requests url = http://current.ip.16yun.cn:802 response = requests.get(url) content = requests.get(url).content print("response headers:", response.headers) print("content:", content)


此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。


import requests data = {'wd':'nike', 'ie':'utf-8'} url='https://www.baidu.com' response = requests.get(url=url, params=data)



2. 对于登陆情况的处理


2.1 使用表单登陆


这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。


import requests data = {'data1':'XXXXX', 'data2':'XXXXX'} response = requests.post(url=url, data=data)


2.2 使用cookie登陆


使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。


 #! -*- encoding:utf-8 -*-  import requests  import random  import requests.adapters   # 要访问的目标页面  targetUrlList = [  "https://httpbin.org/ip",  "https://httpbin.org/headers",  "https://httpbin.org/user-agent",  ]   # 代理服务器(产品官网 www.16yun.cn)  proxyHost = "t.16yun.cn"  proxyPort = "31111"   # 代理隧道验证信息  proxyUser = "username"  proxyPass = "password"   proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {  "host": proxyHost,  "port": proxyPort,  "user": proxyUser,  "pass": proxyPass,  }   # 设置 http和https访问都是用HTTP代理  proxies = {  "http": proxyMeta,  "https": proxyMeta,  }   # 访问三次网站,使用相同的Session(keep-alive),均能够保持相同的外网IP  s = requests.session()   # 设置cookie  cookie_dict = {"JSESSION":"123456789"}  cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)  s.cookies = cookies   for i in range(3):  for url in targetUrlList:  r = s.get(url, proxies=proxies)  print r.text


若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:


response_captcha = requests_session.get(url=url_login, cookies=cookies) response1 = requests.get(url_login) # 未登陆 response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie! response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!