举个例子,爬一爬知乎日报的相关数据 http://daily.zhihu.com/
1、获取源码
import requests
url = 'http://daily.zhihu.com/'
res = requests.get(url).text
print(res)
个人喜欢requests,直接访问,发现返回500错误
C:\Python35\python.exe F:/PyCharm/爬虫/daily.py
500 Server Error
An internal server error occured.
Process finished with exit code 0
根据经验判断,是知乎禁止爬虫,需要加上一些伪装,让我们看看加上浏览器伪装效果
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
url = 'http://daily.zhihu.com/'
res = requests.get(url,headers=headers).text
print(res)
看看结果,已经返回我们需要的数据
C:\Python35\python.exe F:/PyCharm/爬虫/daily.py
知乎日报 - 每天 3 次,每次 7 分钟
...
但是这种写法是否可以应用到所有的网站,答案是“不”
2、代理设置
有时候同一个IP去爬取同一网站上的内容,久了之后就会被该网站服务器屏蔽。解决方法就是更换IP。这个时候,在对方网站上,显示的不是我们真实地IP地址,而是代理服务器的IP地址。
http://www.xicidaili.com/nn/
西刺代理提供了很多可用的国内IP,可以直接拿来使用。
那么如何在爬虫里加入代理呢,看看requests的官方文档怎么说。http://docs.python-requests.org/zh_CN/latest/user/advanced.html#proxies
如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
用法很简单,加入proxies
参数即可
import requests
proxies = {
"http": "http://121.201.24.248:8088",
"https": "http://36.249.194.52:8118",
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
url = 'http://daily.zhihu.com/'
res = requests.get(url,headers=headers,proxies=proxies).text
print(len(res))
为了便于测试,只打印出返回数据的长度
C:\Python35\python.exe F:/PyCharm/爬虫/daily.py
10830
Process finished with exit code 0
发现代理服务器成功爬取知乎日报的信息,内容是10830,故意把代理IP写错一位数,看看结果
import requests
proxies = {
"http": "http://121.201.24.248:8088",
"https": "http://36.249.194.52: 222",
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
url = 'http://daily.zhihu.com/'
res = requests.get(url,headers=headers,proxies=proxies).text
print(len(res))
我们把"https": "http://36.249.194.52:8118"
修改为"https": "http://36.249.194.52: 222"
,此时返回的结果如下,发现不能获取网页数据。所以,在使用代理服务器爬去网站时,如果出现异常,要考虑代理IP是否失效了。
当然你也可以写一个爬虫,实时抓取最新的代理IP用来爬取。
Traceback (most recent call last):
File "F:/PyCharm/爬虫/daily.py", line 9, in
res = requests.get(url,headers=headers,proxies=proxies).text
File "C:\Python35\lib\site-packages\requests\api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "C:\Python35\lib\site-packages\requests\api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python35\lib\site-packages\requests\sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python35\lib\site-packages\requests\sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "C:\Python35\lib\site-packages\requests\adapters.py", line 485, in send
raise ProxyError(e, request=request)
requests.exceptions.ProxyError: HTTPConnectionPool(host='121.201.24.248:8088', port=80): Max retries exceeded with url: http://daily.zhihu.com/ (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError(': Failed to establish a new connection: [Errno 11004] getaddrinfo failed',)))
3、模拟登录
有些网站是需要登录才能看到信息的,例如知乎,直接用requests
获取知乎首页信息,返回数据是需要你登录的,只有登录了才能看到数据。
无法登录?