使用requests+beautifulsoup爬取你想要的数据

在当今大数据时代,数据是比较值钱的东西。很多数据是你拿不到的,要靠自己收集。有一种方法叫爬虫。就是通过爬取网页内容,获得想要的数据。

我们爬取数据能干什么。这就看你的需求。比如有人可以爬网站,下载资源(电影,歌曲,文档,书籍等)
有人可以爬取网站,获取资讯,如爬股票网站,获取股票历史数据;为自己的投资做参考。
爬取招聘网站,可以了解工作机会。
爬取房产网站,获取房价走势,决定出手时机。
爬取行业网站,可以获取行业动态。。。
甚至可以爬取娱乐信息,自动发到自己邮箱,或者微信上,图个开心。

一般我们可以爬取海量数据,通过整理,分析,用图形化展现出来。
在爬取的过程中,可能遇到各种问题,于是就出现了分布式爬虫,爬虫框架,反扒虫等等。

本文这里不搞那么复杂,就是简单用python的一个requests库来实现爬虫。

Requests是一个基于Apache2协议开源的Python HTTP库,号称是“为人类准备的HTTP库”。
Python中,系统自带的urllib和urllib2都提供了功能强大的HTTP支持,但是API接口确实太难用了。requests作为更高一层的封装,用起来简单快捷。
首先得安装:
利用 pip 安装

pip install requests

先看看几个常用的方法和属性

 1.requests.Session()这样就可以在会话中保留状态,保持cookie等

 2.requests.get()获取某个网页

 3.requests.post()发送post请求,类似的,post时也可以发送数据(使用data参数)和定制请求头(使用headers参数)。

一些常用的属性:

result=requests.post(url,data,headers)
result.text  #可以获取响应的内容如抓回来的网页
result. encoding='utf-8'  #有时回来的是乱码,改变编码以使其正常显示根据实际情况改变编码utf-8、gb2312等
result. content  #可以获取二进制内容,如抓取登陆时的验证码等非字符资源
result.cookies  #可以查看当前保存的cookie情况
result. status_code  #可以查看HTTP状态码(如200 OK、404 Not Found等)
result.url  #可以查看当前请求的网址</pre>

有时候我们需要传送的信息不是表单形式的,需要我们传JSON格式的数据过去,所以我们可以用 json.dumps() 方法把表单数据序列化。

import json
import requests

url = 'http://xxx'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
print r.text

Cookies

如果一个响应中包含了cookie,那么我们可以利用 cookies 变量来拿到

import requests

url = 'http://example.com'
r = requests.get(url)
print r.cookies
print r.cookies['example_cookie_name']

超时配置

可以利用 timeout 变量来配置最大请求时间

requests.get('http://github.com', timeout=0.001)

注:timeout 仅对连接过程有效,与响应体的下载无关

Sessions
如果我们要打开多个URL,也就是我们每次发新的请求,使用不同浏览器打开,后面的无法获取cookies。
如果要保持一个持久会话怎么办呢?
解决方案如下

import requests

s = requests.Session()
s.get('http://xxx/login')
r = s.get("http://xxx/home")
print(r.text)

相当于有个全局变量,第一个的cookies存到了全局变量里面,后年的直接拿来用就可以了。

SSL证书验证

现在随处可见 https 开头的网站,Requests可以为HTTPS请求验证SSL证书,就像web浏览器一样。要想检查某个主机的SSL证书,你可以使用 verify 参数。
如果你不想验证,只要设置为False即可,否则会爆如下错误:

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

解决方案:

import requests
r = requests.get('https://kyfw.12306.cn/otn/', verify=False)
print r.text

代理

如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求。
因为很多网站都有反爬措施,限制IP。一般都会考虑用ip池来爬。

import requests

proxies = {
  "https": "http://xxx"
}
r = requests.post("http://yyy", proxies=proxies)
print r.text

好了,掌握了这些知识,就可以开干了。我们以爬取testerhome的topic为例,看每天大家都在关注什么。
这里用requests+beautifulsoup来实现,beautifulsoup主要是用来定位坐标,以后会讲。
首先,用浏览器的开发者工具,打开看看我们请求需要传什么参数(当然这里不用登陆也可以爬取,但是大多数还是需要登陆的)
《使用requests+beautifulsoup爬取你想要的数据》
定位到我们需要定位的元素:
《使用requests+beautifulsoup爬取你想要的数据》
写代码执行,效果是这样的:
《使用requests+beautifulsoup爬取你想要的数据》
很简单吧!我这里只是简单把数据给抓取了,没有写入excel,或者数据库。也没有去分析和展示出来。
当然你有精力,可以进一步加工。用词云展现出来。

代码:

import requests
from bs4 import BeautifulSoup
import re

s = requests.Session()
username = "安蜀黍"
password = "snake"

login_url = "https://testerhome.com/account/sign_in"
search_url= "https://testerhome.com/topics/last"

result = s.post(url=login_url,data={
  "user[login]":username,"user[password]":password,"commit":"登陆"})
print(result.status_code)
print(result.cookies)

page = s.get(search_url)

# soup = BeautifulSoup(page.content, 'html5lib')
soup = BeautifulSoup(page.content, 'lxml')

target = soup.select('div.title.media-heading a')

for title in target:

    find_result = re.search(r'title="(.*?)"',str(title))
    if find_result !=None:
        print(find_result.group(1))

更多精彩,就在微信公众号: python爱好部落

    原文作者:python爱好部落
    原文地址: https://blog.csdn.net/passionboyxie/article/details/78985907
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞