Web Scraping数据抓取

Get HTML 的response内容

response.content

response = requests.get("http://dataquestio.github.io/web-scraping-pages/simple.html")
content = response.content
print(content)

output:
image.png

BeautifulSoup 框架

引入框架
from bs4 import BeautifulSoup

拿上面的content内容来解释

image.png

要访问HTML的内容,首先生成一个页面分析对象,即parser,然后如果要取内部的标签,需要层层向下层的branch中取,好似一个大树,如取title tag,取p tag代码如下

parser = BeautifulSoup(content, 'html.parser') //生成parser分析对象,content为上文requests get到的页面内容
title_text = parser.head.title.text
p_text = parser.body.p.text

find_all

  • 但是不是所有的标签内容都是只有一个同类标签,可能html下面有10个head标签,所以要想get所有的标签不出现混乱,我们使用find_all()函数,以取到html下的第一个head标签为例, parser.find_all("head"),返回一个包含全部head元素的list。
parser = BeautifulSoup(content,'html.parser')
head = parser.find_all("head")
title = head[0].find_all("title")
title_text = title[0].text
print(title_text)
  • find_all也可以带参数id,id可直接定位到要找的标签页,不需要再一层一层寻找下层标签,但定位后仍然需要用[0]跟上因为find_all必定返回list,如寻找如图 id second内容
    image.png

    second_paragraph_text = parser.find_all("p",id = "second")[0].text
  • find_all也可以使用class_来直接访问内部标签的元素,class标注了一种类型的数据,如photo,image,inner_text这种类型定义形式同ID,如图
    image.png

    如访问第二个的outer-text内容代码如下,其中<b></b>标签就不在进行元素查找,直接text即可得内容
    second_outer_text = parser.find_all("p",class = "outer-text")[1].text

CSS(Cascading Style Sheets)

css用来给页面渲染样式,有机几种标签组合方式

  • 所有p标签上红色
p{
    color: red
 }
  • 所有p标签inner-text类红色,类使用.
p.inner-text{
    color: red
 }
  • 所有p标签ID为first标红
p#first{
    color: red
 }
  • 所有ID为first标红
#first{
    color: red
 }
  • 所有inner_test类标红
.inner-text{
    color: red
 }

.select 方法用来按照类和ID名称选取parser中的相关内容

  • 选择类的所有元素使用.inner-text
  • 选择ID的所有元素使用#second
first_outer_text = parser.select(".outer-text")[0].text
second_text = parser.select("#second")[0].text

select的选取范围有无穷多种,以下几个例子如

  • 选取所有div下的p标签
    div p
  • 选取div下的first_item类
    div .first-item
  • 选取body下所有div下ID为first的元素
    body div #first
  • 选取所有first-item类方法元素下ID为first的元素
    .first-item #first

select二次选择

image.png

  • 如图选择Seattle Seahawks队total-yards数量和New England Patriots 的total-plays,注意select之后也是list,要接[]
total_players = parser.select("#total-plays")[0]
patriots_total_plays_count = total_players.select("td")[2].text
print(patriots_total_plays_count)
seahawks_total_yards_count = parser.select("#total-yards")[0].select("td")[1].text
print(seahawks_total_yards_count)

安装Beautifulsoup
Beautifulsoup不是python的标准库,所以需要安装其最新版本Beautiful4(BS4),安装方法在http://www.crummy.com/software/BeautifulSoup/bs4/doc/里面。

  • Linux的安装方法为
    pip3 install beautifulsoup4
  • window的安装方法
    到c:\Users\XXX\AppData\Local\Programs\Python\Python36\Scripts\目录下执行
    pip install beautifulsoup4

鉴于我们大部分linux机器不能联通外网,可以先下载bs4的安装包,由于下载的代码是适应python2安装的,如果是python3环境所以要先执行以下2to3,如果你用python2就不需要了。https://www.crummy.com/software/BeautifulSoup/bs4/download/4.6/

4.6版本最新

tar -zxvf  beautifulsoup4-4.6.0.tar.gz
cd beautifulsoup4-4.6.0
cp /usr/python3/bin/2to3 .
./2to3 -w bs4
python3 setup.py install

安装后import以下如果没有报错就说明安装成功了

python3
>>from bs4 import BeautifulSoup
>>

urllib.parse
urlparse()函数可以将url分割为6部分,对于要分别提取url各个部分的需求是极为好用的函数,具体6部分为

  • scheme url的头部分,一般为http
  • netloc (network location)url的主域名部分,一般为//到/之间的内容,
  • path 主域名之后的部分.html
from urllib.parse import urlparse
o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html') 
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')
print(o.scheme,o.netloc,o.path)

使用Scrapy采集

  • 安装Scrapy
    在window上安装Scrapy很简单,locate到pip的根目录下可以直接使用pip install scrapy即可,现在最新版本的scrapy 1.5 可以直接在python2.7|3.4以上的环境上运行无障碍,以前的版本只能在2.7上,网站为https://scrapy.org/download/可以查看一些1.5版本具体的介绍。
    image.png

windows运行pip install scrapy后可能出现报错如图,看提示是缺少了VC++ 14.0,去http://landinghub.visualstudio.com/visual-cpp-build-tools微软官网去找。

image.png

  • 运行scrapy crawl article时候还是会报错
    image.png

    需要继续安装
    pip install pypiwin32

抓取twitter数据
Twitter是一个数据金矿。不像其他的社交平台,几乎每个Twitter用户的微博都是完全开放并且是可拉取的。如果你想尝试获取大量的数据然后对其进行分析,这是相当有帮助的。同时,Twitter的数据也是非常具体的。它的API接口允许你进行复杂的查询,例如拉取最近20分钟内关于指定某个话题的每一条微博,或者是拉取某个用户非转发的微博。

使用Tweepy
Tweepy是twitter提供的一个python库,用来访问twitter的API接口,官方地址http://www.tweepy.org/,可以阅读下官方Docs了解细节。

image.png

  • 安装方法非常简单,只需
    pip install tweepy
    如果在linux系统上可以通过git安装,先安装git,然后
git clone https://github.com/tweepy/tweepy.git 
cd tweepy 
python setup.py install
  • 注册twitter账号
    登陆https://twitter.com/注册账号,不要注销账号
  • 注册开发者账号
    继续登陆https://apps.twitter.com/,new一个app账号,用户名唯一就行
    image.png

    image.png
  • 查看自己的token
    注册成功我们能查询到自己的consumer Key,consumer Secret,Access Token,Access Token Secret,这几个参数用来访问时候认证和授权,不要泄露出去


    image.png

抓取整个页面
下面我们来抓取整个页面信息,使用home_timeline()函数

import tweepy
consumer_key = ""#填上自己的keys
consumer_secret = ""
access_token = ""
access_token_secret = ""
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token,access_token_secret)
api = tweepy.API(auth)#代入API的keys参数
public_tweets = api.home_timeline()#取当前时间首页的所有内容
for tweet in public_tweets:
    print(type(tweet),type(api))  
    print(tweet,tweet.text,tweet.created_at,tweet.user.screen_name,tweet.user.location)#text表述了twitter的文字内容及链接,created_at是创建的时间,可以看到各种属性值,user.下的screen_name表示了用户名,location表示了地理坐标,如果你对位置敏感一定要关注这个信息

可以看到api类型是tweepy库API类,这个类的具体参数如下图


api

image.png

在后来我们打印出微博的text,可以看到这里包含了我的twitter主页上的微博内容极其链接,时间,地点,看一下内容和我的首页是一样的,我其实挺后悔关注trump的。。弄得一脸都是


微博内容

image.png

抓取指定用户的微博内容
通过user_timeline函数能够抓取指定id用户的可控数量的微博,下面是函数的介绍,

image.png

我们抓取钢铁侠的最近20条微博,以及他的全部用户信息

Robert = api.user_timeline(screen_name = "RobertDowneyJr",count = 20 )#
for tweet in Robert:
    print(tweet.text)
users = api.get_user(id = "RobertDowneyJr")#能够取到该用户的所有信息
print(users)
  • 如图位置我们可以取到用户的screen_name


    image.png
  • 我们也可以从user信息里看到他的全部信息


    image.png

最后我们使用search()函数按照指定query查询微博,q和lang分别指查询query和给明的语言,如果不加lang会出现很多日语,阿拉伯语的微博,我们来搜索一下最近中兴事件的相关微博。


image.png
ZTE = api.search(q = "ZTE",lang = "en")
for item in ZTE:
    print(item.text)
image.png

使用google API
google的各种API可以为我们提供非常多的抓取机会,比如地图位置,邮件,社交,google drive,机器学习,翻译,youtube等等,最常用的我们在app里经常嵌套google地图,我们可以通过google提供给我们的API免费key来调用各种服务API,获取我们想要的信息

image.png

下面代码我们分别查询科学公园,北京时区,白宫地址

import requests
import json
response = requests.get("https://maps.googleapis.com/maps/api/geocode/json?address=1+Science+Park+Boston+Ma+02114&key = <>")#address地点我们填写马萨诸塞州波士顿市科学公园1号
data = response.json()
print(data,"\n")
response2  = requests.get("https://maps.googleapis.com/maps/api/timezone/json?location=39.92,116.46&timestamp=1412649030&key =<>")
data2 = response2.json()
print(data2,"\n")
response3 = requests.get("https://maps.googleapis.com/maps/api/geocode/json?address=The White House+Washington D.C&key = <>")#直接输入了白宫的address,找到了宾夕法尼亚大街1600号
data3 = response3.json()
print(data3)
response4 = requests.get("https://maps.googleapis.com/maps/api/elevation/json?locations=42.3677994,-71.0708078&key = <>")
data4 = response4.json()
print(data4)

google的API能够自动识别白宫,找到其对应的门牌号宾夕法尼亚大街1600号;同时按照北京的经纬度获得了上海时区识别,指定地点海拔5米


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容