学习爬虫不能不使用框架,而python爬虫框架中最常用的就是scrapy了。
学习文档:scrapy0.24文档
1.创建project
scrapy startproject test1
然后,在当前文件夹下就会产生一个文件夹"test1"
文件结构如下:
test1/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
首先,在items.py中定义容器类型,也就是将需要提取的信息建模,比如我要获取网页中的标题和简介信息,我就定义以下字段
class test1Item(scrapy.Item):
title = scrapy.Field()
desc = scrapy.Field()
所有的自定义的item都继承了scrapy.Item,可以使用相应的方法。
然后就可以写爬虫程序了。
在spider文件夹下创建相应的爬虫脚本
# -*- coding: utf-8 -*-
import scrapy
class MydomainSpider(scrapy.Spider):
name = "mydomain"
allowed_domains = ["mydomain.com"]
start_urls = (
'http://www.mydomain.com/',
)
def parse(self, response):
pass
name:定义spider名字的字符串
allowed_domains包含允许爬虫爬取的列表
start_urls:爬虫开始爬取的位置将是列表之一,而后续的url通过后续的数据爬取
parse函数:当response没有指定回调函数将会默认调用该函数,用于处理返回数据,返回值必须为一个Request或者item
再举个例子
# -*- coding:utf-8 -*-
import scrapy
from scrapy_2.items import Scrapy2Item, tuiku_item
from scrapy.contrib.spiders import CrawlSpider, Rule , XMLFeedSpider
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
class spider1(scrapy.Spider):
name = "spider1"
def __init__(self, category = None, *args, **kwargs):
super(spider1, self).__init__(*args, **kwargs)
self.start_urls = ["http://www.tuicool.com/"]
def start_requests(self):
return [scrapy.FormRequest(
'http://www.tuicool.com/login/',
formdata={'email':'786127150@qq.com',
'password':'1223334',
'remember':'1'
},
#callback = self.logged_in,
)]
def logged_in(self, response):
self.log('A new response from %s just arrived.' % response.url)
#self.log(response.info)
def parse(self, response):
self.log('A respose from %s just arrived.' % response.url)
print response.body
这个例子里面我传送的是个POST的request,然后获取登陆后的网页。
之后就是提取信息了,我们使用Selector来匹配信息。
xpath的知识请点这里
根据源代码匹配的代码如下:
def parse(self, response):
self.log('A respose from %s just arrived.' % response.url)
#print response.body
item = []
sel = scrapy.Selector(response)
for path in sel.xpath('//div[contains(@class, "single_left")]'):
items = tuiku_item()
items["title"] = path.xpath('div[contains(@class, "article_title abs-title")]/a/text()').extract()
items["desc"] = path.xpath('div[contains(@class, "article_cut")]/text()').extract()
item.append(items)
return item
在settings.py设置FEED_URI和FEED_FORMAT来将获得的信息保存
FEED_URI = "tuiku.xml"
FEED_FORMAT = "xml"
执行scrapy crawl spider1,在根目录下可找到爬取的信息