我在学习爬虫,下面的内容都我经历的过程,是笔记,也是总结.希望对同新有所帮助
大体的思路就是 环境安装->运行scrapy->分析网页->模拟静态网页登录->模拟动态网页登录
环境安装
基于unbuntu,其它的没有试试. python代码对齐有点奇怪,代码可能有的无法直接复制粘贴使用,请见谅
安装virtualenv
sudo apt install virtualenv //--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来 virtualenv --no-site-packages venv
激活虚拟环境
source venv/bin/activate //在环境下 任意地方执行以下命令可以退出 deactivate
虚拟环境里面安装scrapy
//安装依赖 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev //python3 sudo apt-get install python3 python3-dev //安装scrapy sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
开始码代码
创建scrapy 工程
scrapy startproject tutorial
写爬虫代码
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = 'quotes-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Saved file %s' % filename)
- 运行scrapy
//在工程的上层目录运行命令
scrapy crawl quotes
在pycharm中运行scrapy
如果你让我在vim 或者text 中写python代码,我的内心是拒绝的.有pycharm如此神器,我为毛不用列
- 配置virtualenv环境
Settings -> Project Interpreter
增加一个py文件
//创建文件 加入 一小段python代码
from scrapy.cmdline import execute
execute()
加入Main.py后的项目文件目录格式如下:
配置运行
Run -> Eidt Configurations
测试xpath css
抓取网站
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
简单的了解下xpath 可以查看下面的文档.
了解归了解,只是代码写了才能够真正的理解.
http://www.w3school.com.cn/xpath/index.asp开始测试
//提取包含href 属性的节点 >>> response.xpath('//a[@href="image5.html"]').extract() [u'<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>'] //提取包含href 属性的节点的文本内容 >>> response.xpath('//a[@href="image5.html"]/text()').extract() [u'Name: My image 5 '] //提取包含href 属性 以及别人的属性的节点节点的文本内容 >>> response.xpath('//a[@href="image5.html"] [@other=''"]/text()').extract() [u''] //提取包含href 属性的节点 下 img节点 >>> response.xpath('//a[@href="image5.html"]//img').extract() [u'<img src="image5_thumb.jpg">'] //提取包含href 属性的节点 下 img节点 的src属性 >>> response.xpath('//a[@href="image5.html"]//img/@src').extract() [u'image5_thumb.jpg'] 调用函数提取指定的值 >>> response.xpath('//a[contains(@href,"image")]/@href').extract() [u'image1.html', u'image2.html', u'image3.html', u'image4.html', u'image5.html']
静态网页模拟登录
该章节中假设网页是简单的 容易分析的.
- 安装Request库
pip install requests
- 分析网页
//requests.post 返回response
//response的文本内容可以使用多种方式来进行解析
配置cookie
import requests params = {'username': 'Ryan', 'password': 'password'} requests.post("http://pythonscraping.com/pages/cookies/welcome.php", params) print("Cookie is set to:") print(r.cookies.get_dict()) print("-----------") print("Going to profile page...") r = requests.get("http://pythonscraping.com/pages/cookies/profile.php", cookies=r.cookies)
- 配置请求头
session = requests.Session()
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)
AppleWebKit 537.36 (KHTML, like Gecko) Chrome",
"Accept":"text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,*/*;q=0.8"}
url = "https://www.whatismybrowser.com/
developers/what-http-headers-is-my-browser-sending"
req = session.get(url, headers=headers)
动态网页模拟登录处理
过于复杂的页面分析起来比较困难,尤其是中间执行一些js脚本的.如果有客户端重定向的
安装Selenium
[ Selenium(http://www.seleniumhq.org/)是一个强大的网络数据采集工具,其最初是为网
站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直
接运行在浏览器上。Selenium 可以让浏览器自动加载页面,获取需要的数据,甚至页面截
屏,或者判断网站上某些动作是否发生。]进行安装操作,这个主要是用来执行js的脚本
pip install selenium
安装PhantomJS
[PhantomJS 是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的
JavaScript,但是它不会向用户展示网页的图形界面]//不要通过以下的命令来安装,这是一个坑 sudo apt-get install phantomjs //正确的步骤 //第一步如果下载不了,可以直接访问官网( http://phantomjs.org/download.html) wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 tar xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2 cp /path/to/phantom/untar/bin/phantomjs /usr/local/bin/
提交表单
from selenium import webdriver // 构造访问 driver = webdriver.PhantomJS() driver.get("https://t-pushadm.gionee.com:8443/adm/login.jsp"); print('---------------------- 1111111') //等待三秒 time.sleep(1) //找到指定的元素 填充数据 driver.find_element_by_id('username').clear() driver.find_element_by_id('username').send_keys('xiaojz') driver.find_element_by_id('password').clear() driver.find_element_by_id('password').send_keys('987321') //点击登录动作 driver.find_element_by_id('btn_login').click() //查看你结果 print(driver.page_source)