Python爬虫--真实世界的网页解析

用Requests + BeautifulSoup 爬取Tripadvistor

爬取一个网页需要两步:
1.服务器与本地的接交换机制
2.解析真实网页的方法

1.服务器与本地的交换机制

浏览网页的过程是通过浏览器向网站所在的服务器发送一个Request,同时服务器回应一个Response,这就是一个简单的HTTP协议
每一个Request请求包括很多种方法,目前(HTTP2.0)的方法有:getpostheadputoptionsconnecttracedelete,这八种方法。 GET和POST是最常用的两种方法。
爬虫抓取一个网页,实质上就是模拟这两种方法。

GET/page_one.html HTTP/1.1 Host:www.sample.com
以上是一个简单的get方法发送的请求方式,可以看出请求得到的信息包括页面的内容,协议的版本信息,以及网页的主域名。

一个正常打开的页面,返回的状态码应该是200,无法打开的页面一般返回403或者404

2.爬取Tripadvisor页面信息

爬取页面信息的步骤:
1.导入所需要的库
2.使用requests请求要爬取的网页
3.解析网页
4.描述要爬取的元素位置

#_*_ coding:utf-8 _*_


from bs4 import BeautifulSoup
import requests
import time


# part1
'''
url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html'
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
# 1.描述要爬取元素的位置
# Copy一下title的selector,测试一下结果
# titles = soup.select('#ATTR_ENTRY_105127 > div.property_title > a')
# print titles
# 打开原网页,查找title的父标签样式,发现在每一个<div class="property_title">下面的<a>标签中的内容就是title
# 那么更新一下titte的解析语句
titles = soup.select('div.property_title > a[target="_blank"]')

# 2.筛选所需要的元素
# 页面中存在的图片不一定全是所需要的,可以根据图片的属性(大小)对图片进行筛选
imgs = soup.select('img[width="160"]')

# 对其他的元素进行筛选
# tags一般是多对一的关系,所以在tags的父类标签进行筛选
cates = soup.select('div.p13n_reasoning_v2')

# 3.整理并筛选所需信息

for title, img, cate in zip(titles, imgs, cates):
    data = {
        'title': title.get_text(),
        'img': img.get('src'),
        'cate':list(cate.stripped_strings)
    }
    print data,'\n*************************************\n'
# 运行上述代码后发现,爬取的图片链接是一样的,也就意味着图片信息没有爬取下来
# 这是由于站点的反爬虫机制造成的,站点的图片加载是通过JavaScript控制的,暂时先不用管这些

# 4.使爬虫为登录站点的状态,构造向服务器提交的参数:headers
# 重新完成一个爬虫代码
'''

# part2
'''
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36',
    'Cookie':'__utma=55896302.1244431692.1455603774.1455603774.1455603774.1; __utmc=55896302; =',

}
url_saves = 'http://www.tripadvisor.cn/Saves#207971'
wb_data = requests.get(url_saves, headers=headers)
soup = BeautifulSoup(wb_data.text, 'lxml')

titles = soup.select('a.location-name')
imgs = soup.select('img.photo_image')
metas = soup.select('span.format_address')

for title, img, meta in zip(titles, imgs, metas):
    data = {
        'title':title.get_text(),
        'img':img.get('src'),
        'meta':list(meta.stripped_strings),
    }
    print data

'''


# 构造函数

url_saves = 'http://www.tripadvisor.cn/Saves#207971'
url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html'
# 连续爬取30页的网页信息,发现每一页的区别在于 oa30 这个参数上,每一页的站点在这个数值的基础上增加30
# 所以可以用以下的格式进行爬取
urls = ['http://www.tripadvisor.cn/Attractions-g60763-Activities-oa{}-New_York_City_New_York.html#ATTRACTION_LIST'.format(str(i)) for i in range(30,930,30)]
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36',
    'Cookie':'__utma=55896302.1244431692.1455603774.1455603774.1455603774.1; __utmc=55896302; =',
}

def get_attractions(url, data=None):
    wb_data   = requests.get(url)
    time.sleep(4)
    soup      = BeautifulSoup(wb_data.text, 'lxml')
    titles    = soup.select('div.property_title > a[target="_blank"]')
    imgs      = soup.select('img[width="160"]')
    cates     = soup.select('div.p13n_reasoning_v2')
    for title, img, cate in zip(titles, imgs, cates):
        data = {
            'title':title.get_text(),
            'img': img.get('src'),
            'cate':list(cate.stripped_strings),
        }
        print data,'\n','*'*50,'\n'


def get_favs(url, data=None):
    wb_data = requests.get(url, headers=headers)
    soup    = BeautifulSoup(wb_data.text, 'lxml')
    titles  = soup.select('a.location-name')
    imgs    = soup.select('img.photo_image')
    metas   = soup.select('span.format_address')

    if data == None:
        for title, img, meta in zip(titles, imgs, metas):
            data = {
                'title':title.get_text(),
                'img':img.get('src'),
                'meta':list(meta.stripped_strings),
            }
            print data,'\n','*'*50,'\n'

for single_url in urls:
    get_attractions(single_url)


# 6.爬取多连续页的资料


代码演示了简单的爬虫,带Cookie的爬虫,以及连续爬取多个页面的爬虫。

为了应对站点的反爬虫机制,也可以利用模拟手机端登录的方式进行站点的爬取:

# 手机端抓取网页信息
from bs4 import BeautifulSoup
import requests


headers = {
    'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
}

url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-oa30-New_York_City_New_York.html'
mb_data = requests.get(url, headers=headers)
soup = BeautifulSoup(mb_data.text, 'lxml')
imgs = soup.select('div.thumb.thumbLLR.soThumb > img')
for i in imgs:
    print i.get('src')


从代码中可以看出,模拟手机端的爬虫与一般的爬虫非常的相似,区别在于headers中的User-Agent是不一样的,这个也是非常简单的,Chrome浏览器可以通过很简单的方式进行手机端登录站点的模拟。具体实现可以在网上查找一下。

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

推荐阅读更多精彩内容