用scrapy爬取网页数据

刚开始接触scrapy,乍那么一看,这都是些什么鬼,感觉好难。。。。。。

学习历程大概是这样的:

1.先百度了scrapy的官方文档,scrapy官方文档,早就安装了scrapy,cmd->python->import scrapy的时候是很正常的,不过在pycharm中导入一直都有红杠杠的。。。。不得不又卸了重新装。在这里特别要注意scrapy的s的大小写。pip安装的时候是大写,导入模块的时候是小写。

2.然后就是创建工程。

scrapy crawl project-name
然后就一直闹不懂创建出来的这些东西有什么意义。

# 制作爬虫(Spider):在spider文件夹中建立.py文件制作爬虫开始爬取网页

# 明确目标(Items):明确你想要抓取的目标

# 存储内容(Pipeline):设计管道存储爬取内容

3.先编写爬虫

首先,要爬取的网页是http://heart.39.net/zhlm/bljd/xzb/index.html

(一个灰常简单的网页,我怎么感觉不到,~~~~(>_<)~~~~)

爬取文章的标题和内容,而内容都在新的链接里。

4.items文件

import scrapy
from scrapy import Item,Field

class HeartdiseaseItem(scrapy.Item):
    #网页标题
    title=scrapy.Field()
    #内容链接
    url=scrapy.Field()
    #内容描述
    content=scrapy.Field()
5.文件


开始写的时候在spider里面创建的是heartDisease.py。然后fromheartDisease.items import HeartdiseaseItem 的时候就会报错。因为会就近的搜索,然后就会找到heartDisease.py,但是里面没有items。我想导入的是文件夹heartDisease里面的items.py里的HeartdiseaseItem,改了名字后才导入成功。


6.运行spider
开始写了简单的代码,只会在cmd中输入spider crawl heartDisease 。heartDisease是自己定义的名字,运行时要保持一致,name是必须的。

也可以编写一个main.py文件,在里面输入运行的命令。
#coding=utf-8
from scrapy import cmdline
cmdline.execute("scrapy crawl heartDisease".split())
 
 
7.刚开始写的部分代码
这是获取初始网页内部链接里的内容。
def parseContent(self,response):
        selector1=Selector(response)
        title=selector1.xpath('//title/text()').extract()
        item=heartDisease()
        item['title']=selector1.xpath('//title/text()').extract()[0]
        item['content'] = selector1.xpath('//div[@class="art_con"]/p/text()').extract()
        item['url'] = response.url
        yield item
xpath的用法:xpath简介。要注意“//”和“/”的用法,一开始小某还用错了呢。
8.将获取的数据存储到本地文件中。
 
官方文档中有写,不过没看懂。得亏旁边有大神。
在settings.py文件中配置内容
BOT_NAME = 'heartDisease'
USER_AGENT='Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
FEED_URI=u'file///D:/Python test/heartDisease/DATA1.csv'
FEED_FORMAT='CSV'
SPIDER_MODULES = ['heartDisease.spiders']
NEWSPIDER_MODULE = 'heartDisease.spiders'
其中,“file///”是固定模式,在其后面加路径即可。
9.完整的代码
# coding:utf-8
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from heartDisease.items import HeartdiseaseItem
class heartSpider(CrawlSpider):
    name = "heartDisease"
    #开始的网址start_urls
    start_urls=['http://heart.39.net/zhlm/bljd/xzb/']
    def __init__(self):
        self.item=HeartdiseaseItem()
    def parse(self, response):
        selector=Selector(response)
        #获取网页中的链接
        urls=selector.xpath('//div[@class="newslist"]/ul/li/a/@href').extract()
        #遇到一个链接则调用一次parseContent函数
        for url in urls:
            yield Request(url, callback=self.parseContent)
        #获取页数链接
        page_links=selector.xpath('//div[@class="page"]//a').extract()
        #当a标签下的文本为“下一页”时,获取该a标签里的链接,便可以跳转到下一页
        for link in page_links:
            if  u'下一页' in link:
                next_link = selector.xpath('//div[@class="page"]//a/@href').extract()[-2]
                next_link='http://heart.39.net/zhlm/bljd/xzb/'+next_link
                yield Request(next_link, callback=self.parse)
    #获取各个链接里的内容,并传给item
    def parseContent(self,response):
        selector1=Selector(response)
        title=selector1.xpath('//title/text()').extract()
        self.item['title']=selector1.xpath('//title/text()').extract()[0]
        self.item['content'] = selector1.xpath('//div[@class="art_con"]/p/text()').extract()
        self.item['url'] = response.url
        yield self.item

在写parse函数里的for循环时一直出错,要么是列表超出范围,要么就是item_1什么的丢失。不过最后还是改对了。
当然,这个网页的爬取代码也可以不用for循环。毕竟一共只有三页,可以在start_urls中将网址全部放进去,如果页数太多就不建议这么写了。
分享一下:
http://www.cnblogs.com/Shirlies/p/4536880.html
http://www.tuicool.com/articles/eymema
http://www.cnblogs.com/jojolin/p/4642469.html
小某说:
嘿嘿嘿,好好学习,天天向上。我先去吃饭= ̄ω ̄=!!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值