一.背景
最近玩爬虫,各种想爬,scrapy 又非常好用。想多爬一点东西,决定爬一爬各大网站的热点新闻。
想到就开始做了哈
项目已经爬取:
豆瓣, 微博, 百度贴吧, 虎扑, github,百度今日热点
二.上代码
1.开始搭建项目
scrapy startproject crawl_everything
#起了个叼叼的名字
2.修改配置文件
- settings.py 设置文件:
ROBOTSTXT_OBEY = False
# 下载延时
DOWNLOAD_DELAY = 0.5
#增加user-agent 这个可以拿自己浏览器的。也可以网上搜一些其他的。东西很多的
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
初步设想,我只需要存取文章的标题和内容链接和抓取时间
- 修改 items.py
那么定义的 item 如下:
class CrawlEverythingItem(scrapy.Item):
# 文章标题
jk_title = scrapy.Field()
# 文章链接
jk_url = scrapy.Field()
# 文章时间有可能没有
jk_date = scrapy.Field()
3 : 生成第一个网站文件【豆瓣】:
#注意:这个命令在 spiders 目录执行
scrapy genspider douban_spider www.douban.com
上个结果图:
#先抓取豆瓣上的【24 小时话题趋势】看看大家都在讨论啥
目标网址:https://www.douban.com/gallery/
知道目标了就开始爬吧:通过 chrome 的 debug 功能找到对应标签
def parse(self, response):
trends=response.css('ul.trend > li > a')
for trend in trends:
item = CrawlEverythingItem()
item['jk_title']=trend.css('a::text').extract_first()
item['jk_url'] = trend.css('a').attrib['href']
yield item
程序这就写好了。运行一下
scrapy crawl douban_spider
可以看到确实是能把文章给爬到。
但每次需要输入命令颇为麻烦。
为了简单弄了个 main 函数主程序【mainCrawlEveryThing.py】,方便启动和 debug
内容如下:
# coding: utf-8
from scrapy.cmdline import execute
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy', 'crawl', 'douban_spider']) # 你需要将此处的douban_spider替换为你自己的爬虫名称
运行程序,效果和在 cmd 里输入命令效果一致。
4 : 数据入库:
接下来数据爬到了该入库了。
新建了一个数据库和一张表
后续在完善:先开门红一个豆瓣。逐步完善
用一个爬虫主类增加了几个网站的爬取,def parse(self, response): if response.url == self.start_urls[0]:#豆瓣 yield from self.crawl_douban(response) if response.url == self.start_urls[1]: # 微博 yield from self.crawl_weibo(response) if response.url == self.start_urls[2]: # 百度贴吧 yield from self.crawl_tieba(response) if response.url == self.start_urls[3]: # 虎扑 yield from self.crawl_hupu(response) if response.url == self.start_urls[4]: # github yield from self.crawl_github(response) if response.url == self.start_urls[5]: # 百度今日热点 yield from self.crawl_topbaidu(response) def crawl_douban(self, response): trends = response.css('ul.trend > li > a') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'douban_spider' item['jk_title'] = trend.css('a::text').extract_first() item['jk_url'] = trend.css('a').attrib['href'] item['jk_remark'] = '' yield item def crawl_weibo(self, response): trends = response.css('td.td-02 > a') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'weibo_spider' item['jk_title'] = trend.css('a::text').extract_first() href = self.get_weibo_href(trend) item['jk_url'] = "https://s.weibo.com" + href item['jk_remark'] = '' yield item def crawl_tieba(self, response): trends = response.css('div.main > ul > li a') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'tieba_spider' item['jk_title'] = trend.css('a::text').extract_first() item['jk_url'] = trend.css('a').attrib['href'] item['jk_remark'] = '' yield item def crawl_hupu(self, response): trends = response.css('div.list> ul > li >span:nth-child(1) >a') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'hupu_spider' item['jk_title'] = trend.css('a').attrib['title'] item['jk_url'] ="https://bbs.hupu.com"+trend.css('a').attrib['href'] item['jk_remark'] = '' yield item def crawl_github(self, response): trends = response.css('div> article.Box-row ') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'github_spider' jk_title="".join(trend.css('p::text').extract()) re.sub(r'[\\*|“<>:/()()0123456789]', '', jk_title) jk_title.replace('\n', '').replace(' ', '') item['jk_title'] = jk_title item['jk_url'] = "https://github.com" + trend.css('h1>a').attrib['href'] item['jk_remark'] = '' yield item def crawl_topbaidu(self, response): trends = response.css('td.keyword >a:nth-child(1) ') for trend in trends: item = CrawlEverythingItem() item['jk_source'] = 'topbaidu_spider' item['jk_title'] = trend.css('a::text').extract_first() item['jk_url'] = trend.css('a').attrib['href'] item['jk_remark'] = '' yield item def get_weibo_href(self,trend): href = trend.css('a').attrib['href'] if href.startswith('javascript'): ##javascript:void(0) href = trend.css('a').attrib['href_to'] return href
增加了一个爬虫主类 mainCrawlEveryThing.py
# coding: utf-8 from scrapy.cmdline import execute import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) execute(['scrapy', 'crawl', 'crawl_everything_spider']) # 你需要将此处的douban_spider替换为你自己的爬虫名称
数据库增加一个日期字段,修改了创建时间字段。
git 已修改,并上传。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于