文章目录

  • 2.1自动化登录Facebook
  • 2.3自动化登录Linkedin
  • 爬取Google真实的搜索表单
  • 爬取依赖JavaScript的网站Facebook
  • 爬取典型在线商店Gap
  • 爬取拥有地图接口的宝马官网
    #1.爬Google搜索引擎
# -*- coding: utf-8 -*-import sys
import urllib
import urlparse
import lxml.html
from downloader import Downloaderdef search(keyword):D = Downloader()url = 'https://www.google.com/search?q=' + urllib.quote_plus(keyword)html = D(url)tree = lxml.html.fromstring(html)links = []for result in tree.cssselect('h3.r a'):link = result.get('href')qs = urlparse.urlparse(link).querylinks.extend(urlparse.parse_qs(qs).get('q', []))return linksif __name__ == '__main__':try:keyword = sys.argv[1]except IndexError:keyword = 'test'print search(keyword)

注意:提取Google搜索结果时注意爬取延时问题,否则下载速度过快会出现验证码处理。
#2.爬Facebook和Linkein
查看Packt出版本的Facebook页面源代码时,可以找到最开始的几篇日志,但后面的日志只有浏览器滚动时才会通过AJAX加载。

  • 电脑网页端:http://www.facebook.com/PacktPub
  • 移动网页端:http://m.facebook.com/PacktPub

2.1自动化登录Facebook

这些AJAX的数据无法简化提取,虽然这些AJAX事件可以被卧逆向工程,但是不同类型的Facebook页面使用了不用的AJAX调用。所以下面用Selenium渲染实现自动化登录Facebook。

# -*- coding: utf-8 -*-import sys
from selenium import webdriverdef facebook(username, password, url):driver = webdriver.Firefox()driver.get('https://www.facebook.com')driver.find_element_by_id('email').send_keys(username)driver.find_element_by_id('pass').send_keys(password)driver.find_element_by_id('login_form').submit()driver.implicitly_wait(30)# wait until the search box is available,# which means have succrssfully logged insearch = driver.find_element_by_id('q')# now are logged in so can navigate to the page of interestdriver.get(url)# add code to scrape data of interest here#driver.close()if __name__ == '__main__':try:username = sys.argv[1]password = sys.argv[2]url = sys.argv[3]except IndexError:print 'Usage: %s <username> <password> <url>' % sys.argv[0]else:facebook(username, password, url)

##2.2提取Facebook的API数据
Facebook提供了一些API数据,如果允许访问这些数据,下面就提取Packt出版社页面的数据。

# -*- coding: utf-8 -*-import sys
import json
import pprint
from downloader import Downloaderdef graph(page_id):D = Downloader()html = D('http://graph.facebook.com/' + page_id)return json.loads(html)if __name__ == '__main__':try:page_id = sys.argv[1]except IndexError:page_id = 'PacktPub'pprint.pprint(graph(page_id))

Facebook开发者文档:https://developers.facebook.com/docs/graph-api 这些API调用多数是设计给已授权的facebook用户交互的facebook应用的,要想提取比如用户日志等更加详细的信息,仍然需要爬虫。

2.3自动化登录Linkedin

# -*- coding: utf-8 -*-import sys
from selenium import webdriverdef search(username, password, keyword):driver = webdriver.Firefox()driver.get('https://www.linkedin.com/')driver.find_element_by_id('session_key-login').send_keys(username)driver.find_element_by_id('session_password-login').send_keys(password)driver.find_element_by_id('signin').click()driver.implicitly_wait(30)driver.find_element_by_id('main-search-box').send_keys(keyword)driver.find_element_by_class_name('search-button').click()driver.find_element_by_css_selector('ol#results li a').click()# Add code to scrape data of interest from LinkedIn page here#driver.close()if __name__ == '__main__':try:username = sys.argv[1]password = sys.argv[2]keyword = sys.argv[3]except IndexError:print 'Usage: %s <username> <password> <keyword>' % sys.argv[0]else:search(username, password, keyword)

#3.爬在线商店Gap
Gap拥有一个结构化良好的网站,通过Sitemap可以帮助网络爬虫定位到最新的内容。从http://www.gap.com/robots.txt 中可以发现网站地图Sitemap: http://www.gap.com/products/sitemap_index.html

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://www.gap.com/products/sitemap_1.xml</loc>
<lastmod>2017-01-30</lastmod>
</sitemap>
<sitemap>
<loc>http://www.gap.com/products/sitemap_2.xml</loc>
<lastmod>2017-01-30</lastmod>
</sitemap>
</sitemapindex>

如上网站地图册链接的内容仅仅是索引,其索引的网站地图才是数千种产品类目的链接,比如:http://www.gap.com/products/blue-long-sleeve-shirts-for-men.jsp 。由于这里有大量要爬取的内容,因此我们将使用第4篇开发的多线和爬虫,并支持一人可选的回调参数。

# -*- coding: utf-8 -*-from lxml import etree
from threaded_crawler import threaded_crawlerdef scrape_callback(url, html):if url.endswith('.xml'):# Parse the sitemap XML filetree = etree.fromstring(html)links = [e[0].text for e in tree]return linkselse:# Add scraping code herepass       def main():sitemap = 'http://www.gap.com/products/sitemap_index.xml'threaded_crawler(sitemap, scrape_callback=scrape_callback)if __name__ == '__main__':main()

该回调函数首先下载到的URL扩展名。如果扩展名是.xml,则用lxml的etree模块解析XML文件并从中提取链接。否则,认为这是一个类目URL(这例没有实现提取类目的功能)。
#4.爬宝马官网
宝马官方网站中有一个查询本地经销商的搜索工具,其网址为https://www.bmw.de/de/home.html?entryType=dlo
该工具将地理位置作为输入参数,然后在地图上显示附近的经销商地点,比如输入BerlinLook For
我们使用开发者工具会发现搜索触发了AJAX请求:
https://c2b-services.bmw.com/c2b-localsearch/services/api/v3/clients/BMWDIGITAL_DLO/DE/pois?country=DE&category=BM&maxResults=99&language=en&lat=52.507537768880056&lng=13.425269635701511
maxResults默认设为99,我们可以增大该值。AJAX请求提供了JSONP格式的数据,其中JSONP是指填充模式的JSON(JSON with padding)。这里的填充通常是指要调用的函数,而函数的参数则为纯JSON数据。本例调用的是callback函数,要想使用Pythonr的json模块解析该数据,首先需要将填充的部分截取掉。

# -*- coding: utf-8 -*-import json
import csv
from downloader import Downloaderdef main():D = Downloader()url = 'https://c2b-services.bmw.com/c2b-localsearch/services/api/v3/clients/BMWDIGITAL_DLO/DE/pois?country=DE&category=BM&maxResults=%d&language=en&lat=52.507537768880056&lng=13.425269635701511'jsonp = D(url % 1000) ###callback({"status:{...}"})pure_json = jsonp[jsonp.index('(') + 1 : jsonp.rindex(')')]dealers = json.loads(pure_json) ###with open('bmw.csv', 'w') as fp:writer = csv.writer(fp)writer.writerow(['Name', 'Latitude', 'Longitude'])for dealer in dealers['data']['pois']:name = dealer['name'].encode('utf-8')lat, lng = dealer['lat'], dealer['lng']writer.writerow([name, lat, lng])if __name__ == '__main__':main()
>>> dealers.keys() #[u'status',u'count',u'data',...]
>>> dealers['count'] #显示个数
>>> dealers['data']['pois'][0] #第一个经销商数据

Wu_Being 博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
【Python爬虫系列】《【Python爬虫9】Python网络爬虫实例实战》http://blog.csdn.net/u014134180/article/details/55508272
Python爬虫系列的GitHub代码文件:https://github.com/1040003585/WebScrapingWithPython

【Python爬虫9】Python网络爬虫实例实战相关推荐

  1. python爬虫设计模式_Python3网络爬虫(一):利用urllib进行简单的网页抓取

    点击蓝色字免费订阅,每天收到这样的好信息 前言:最近有不少粉丝关注本公众号.并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧.大家想买什 ...

  2. Python 网络爬虫 001 (科普) 网络爬虫简介

    Python 网络爬虫 001 (科普) 网络爬虫简介 1. 网络爬虫是干什么的 我举几个生活中的例子: 例子一: 我平时会将 学到的知识 和 积累的经验 写成博客发送到CSDN博客网站上,那么对于我 ...

  3. python 爬虫论_Python网络爬虫(理论篇)

    欢迎关注公众号:Python爬虫数据分析挖掘,回复[开源源码]免费获取更多开源项目源码 网络爬虫的组成 网络爬虫由控制节点,爬虫节点,资源库构成. 网络爬虫的控制节点和爬虫节点的结构关系 控制节点(爬 ...

  4. python新闻聚合_基于Python的新闻聚合系统网络爬虫研究

    基于 Python 的新闻聚合系统网络爬虫研究 左卫刚 [摘 要] 摘 要 本研究旨在创建一个能够从不同页面布局中提取数据的开源爬 虫,其中包括网络爬虫. API .网络爬虫调度器以及 Socket ...

  5. Python网络爬虫——1、网络爬虫简介

    什么是网络爬虫 网络爬虫又称网络蜘蛛.网络蚂蚁.网络机器人,它可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法.使用Python可以方便的编写出 ...

  6. python爬虫什么意思-网络爬虫是什么(python爬虫有什么用)

    在这个谈论数据的时代,数据是一件极其重要的事情.我们如何获取完整而全面的数据?这不是一项容易的任务. 如果你想做好大数据分析,光靠自己的努力或外围数据是远远不够的,你需要依靠"神秘的外力&q ...

  7. python3.6网络爬虫_python3.6网络爬虫

    <精通Python网络爬虫:核心技术.框架与项目实战>--导读 前 言 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引擎中,主要使用通用网络爬虫 ...

  8. 如何对付网络爬虫 - JavaEye和网络爬虫斗争之路

    http://www.kuqin.com/searchengine/20090806/66174.html 作者:robbin 来源:JavaEye 由于搜索引擎的泛滥,网络爬虫如今已经成为全球互联网 ...

  9. 爬虫分类——通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫

    爬虫分类 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫.聚焦网络爬虫.增量式网络爬虫.深层网络爬虫. 实际的网络爬虫系统通常是几种爬虫技术相结合实现的 通用网络爬虫 通用网络 ...

  10. java爬虫学习_java网络爬虫基础学习(一)

    刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...

最新文章

  1. 解题报告:X、骑士共存问题(最大独立集)(匈牙利 / 最大流)
  2. AJAX应注意IIS有没有.ashx扩展
  3. PHP匹配函数怎么用,php preg_match_all函数怎么用
  4. adxl276怎么添加到proteus中_奶粉中的营养强化剂和食品添加剂是怎么一回事?
  5. linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃
  6. 漫谈Windows共享内存
  7. 拦截 数据_大数据之六类Flume拦截器配置
  8. Mybatis 动态传入表名 字段名 的解决办法
  9. Ubuntu安装R及RStudio
  10. linux系统微信怎么放桌面上,Linux桌面给软件添加快捷图标deepinUbuntu安装微信开发者工具...
  11. coreldraw快速撤回_CDR X8撤销、重做与重复操作方法介绍
  12. 储存管理系统c语言,《C语言,图书管理系统,未做文件储存系统.docx
  13. 你应该知道的四种并发工具类
  14. dwz jui 修改html元素,js框架 dwz jui 的日历组件 添加自定义事件
  15. win10内存满载测试软件,高手亲自解决win10内存检测工具的详尽处理步骤
  16. 美国计算机编程竞赛,USACO美国计算机竞赛
  17. virtualenvs error: deactivate must be sourced. Run 'source deactivate' instead of 'deactivate'
  18. selenium实现163邮箱自动登录
  19. Coremail2022Q4邮件安全报告:暴力破解骤降,盗号问题有所缓解?
  20. 基于深度学习神经网络的农业病虫害识别(完整代码+数据)

热门文章

  1. 使用手机作单反相机的遥控器
  2. 易茶APP:茶叶微商城案例分析
  3. 人大李崇轩:我的生成模型修炼之路丨智源大会嘉宾风采
  4. html中data-属性作用,html中的data-*的用法和作用 自定义属性
  5. 二手车交易价格预测方案——数据分析EDA
  6. UE4seq过场动画混合到玩家视角
  7. 一种新颖的智能优化算法—飞蛾扑火优化(MFO)算法
  8. java 超大整数加法,JAVA实现的大整数加法
  9. QUIC协议原理分析
  10. 直播手机支架上的灯和多机位的作用