Python爬虫入门(一)获取源码

举个例子,爬一爬知乎日报的相关数据 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 分钟
...

但是这种写法是否可以应用到所有的网站,答案是“不”

Python爬虫入门(一)获取源码_第1张图片

2、代理设置

有时候同一个IP去爬取同一网站上的内容,久了之后就会被该网站服务器屏蔽。解决方法就是更换IP。这个时候,在对方网站上,显示的不是我们真实地IP地址,而是代理服务器的IP地址。

http://www.xicidaili.com/nn/
西刺代理提供了很多可用的国内IP,可以直接拿来使用。

Python爬虫入门(一)获取源码_第2张图片

那么如何在爬虫里加入代理呢,看看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获取知乎首页信息,返回数据是需要你登录的,只有登录了才能看到数据。




你可能感兴趣的:(Python爬虫入门(一)获取源码)