用Scrapy抓取豆瓣小组数据(二)

接着上篇博客《用Scrapy抓取豆瓣小组数据(一)》http://my.oschina.net/chengye/blog/124157

在scrapy中怎么让Spider自动去抓取豆瓣小组页面

1,引入Scrapy中的另一个预定义的蜘蛛CrawlSpider

1 from scrapy.contrib.spiders import CrawlSpider, Rule
2 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

2, 基于CrawSpider定义一个新的类GroupSpider,并添加相应的爬行规则。

01 class GroupSpider(CrawlSpider):
02     name = "Group"
03     allowed_domains = ["douban.com"]
04     start_urls = [
05         "http://www.douban.com/group/explore?tag=%E8%B4%AD%E7%89%A9",
06         "http://www.douban.com/group/explore?tag=%E7%94%9F%E6%B4%BB",
07         "http://www.douban.com/group/explore?tag=%E7%A4%BE%E4%BC%9A",
08         "http://www.douban.com/group/explore?tag=%E8%89%BA%E6%9C%AF",
09         "http://www.douban.com/group/explore?tag=%E5%AD%A6%E6%9C%AF",
10         "http://www.douban.com/group/explore?tag=%E6%83%85%E6%84%9F",
11         "http://www.douban.com/group/explore?tag=%E9%97%B2%E8%81%8A",
12         "http://www.douban.com/group/explore?tag=%E5%85%B4%E8%B6%A3"
13     ]
14  
15     rules = [
16         Rule(SgmlLinkExtractor(allow=('/group/[^/]+/$', )), callback='parse_group_home_page', process_request='add_cookie'),
17         Rule(SgmlLinkExtractor(allow=('/group/explore\?tag', )), follow=True, process_request='add_cookie'),
18     ]
start_urls预定义了豆瓣有所小组分类页面,蜘蛛会从这些页面出发去找小组。

rules定义是CrawlSpider中最重要的一环,可以理解为:当蜘蛛看到某种类型的网页,如何去进行处理。

例如,如下规则会处理URL以/group/XXXX/为后缀的网页,调用parse_group_home_page为处理函数,并且会在request发送前调用add_cookie来附加cookie信息。

1 Rule(SgmlLinkExtractor(allow=('/group/[^/]+/$', )), callback='parse_group_home_page', process_request='add_cookie'),
又如,如下规则会抓取网页内容,并自动抓取网页中链接供下一步抓取,但不会处理网页的其他内容。
1 Rule(SgmlLinkExtractor(allow=('/group/explore\?tag', )), follow=True, process_request='add_cookie'),


如何添加Cookie

定义如下函数,并如前面所讲在Rule定义里添加process_request=add_cookie。

1 def add_cookie(self, request):
2     request.replace(cookies=[
3         {'name''COOKIE_NAME','value''VALUE','domain''.douban.com','path''/'},
4         ]);
5     return request;
一般网站在client端都用cookie来保存用户的session信息,添加cookie信息就可以模拟登陆用户来抓取数据。


如何防止蜘蛛被网站Ban掉

首先可以尝试添加登陆用户的cookie去抓取网页,即使你抓取的是公开网页,添加cookie有可能会防止蜘蛛在应用程序层被禁。这个我没有实际验证过,但肯定没有坏处。

其次,即使你是授权用户,如果你的访问过于频繁,你的IP会可能被ban,所以一般你需要让蜘蛛在访问网址中间休息1~2秒。

还有就是配置User Agent,尽量轮换使用不同的UserAgent去抓取网页

在Scrapy项目的settings.py钟,添加如下设置:

1 DOWNLOAD_DELAY = 2
2 RANDOMIZE_DOWNLOAD_DELAY = True
3 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'
4 COOKIES_ENABLED = True

================

到此位置,抓取豆瓣小组页面的蜘蛛就完成了。接下来,可以按照这种模式定义抓取小组讨论页面数据的Spider,然后就放手让蜘蛛去爬行吧!Have Fun!

01 from scrapy.contrib.spiders import CrawlSpider, Rule
02 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
03 from scrapy.selector import HtmlXPathSelector
04 from scrapy.item import Item
05 from douban.items import DoubanItem
06 import re
07  
08 class GroupSpider(CrawlSpider):
09     name = "Group"
10     allowed_domains = ["douban.com"]
11     start_urls = [
12         "http://www.douban.com/group/explore?tag=%E8%B4%AD%E7%89%A9",
13         "http://www.douban.com/group/explore?tag=%E7%94%9F%E6%B4%BB",
14         "http://www.douban.com/group/explore?tag=%E7%A4%BE%E4%BC%9A",
15         "http://www.douban.com/group/explore?tag=%E8%89%BA%E6%9C%AF",
16         "http://www.douban.com/group/explore?tag=%E5%AD%A6%E6%9C%AF",
17         "http://www.douban.com/group/explore?tag=%E6%83%85%E6%84%9F",
18         "http://www.douban.com/group/explore?tag=%E9%97%B2%E8%81%8A",
19         "http://www.douban.com/group/explore?tag=%E5%85%B4%E8%B6%A3"
20     ]
21  
22     rules = [
23         Rule(SgmlLinkExtractor(allow=('/group/[^/]+/$', )), callback='parse_group_home_page', process_request='add_cookie'),
24     #   Rule(SgmlLinkExtractor(allow=('/group/[^/]+/discussion\?start\=(\d{1,4})$', )), callback='parse_group_topic_list', process_request='add_cookie'),
25         Rule(SgmlLinkExtractor(allow=('/group/explore\?tag', )), follow=True, process_request='add_cookie'),
26     ]
27  
28     def __get_id_from_group_url(self, url):
29         =  re.search("^http://www.douban.com/group/([^/]+)/$", url)
30         if(m):
31             return m.group(1)
32         else:
33             return 0
34  
35  
36  
37     def add_cookie(self, request):
38         request.replace(cookies=[
39  
40         ]);
41         return request;
42  
43     def parse_group_topic_list(self, response):
44         self.log("Fetch group topic list page: %s" % response.url)
45         pass
46  
47  
48     def parse_group_home_page(self, response):
49  
50         self.log("Fetch group home page: %s" % response.url)
51  
52         hxs = HtmlXPathSelector(response)
53         item = DoubanItem()
54  
55         #get group name
56         item['groupName'= hxs.select('//h1/text()').re("^\s+(.*)\s+$")[0]
57  
58         #get group id
59         item['groupURL'= response.url
60         groupid = self.__get_id_from_group_url(response.url)
61  
62         #get group members number
63         members_url = "http://www.douban.com/group/%s/members" % groupid
64         members_text = hxs.select('//a[contains(@href, "%s")]/text()' % members_url).re("\((\d+)\)")
65         item['totalNumber'= members_text[0]
66  
67         #get relative groups
68         item['RelativeGroups'= []
69         groups = hxs.select('//div[contains(@class, "group-list-item")]')
70         for group in groups:
71             url = group.select('div[contains(@class, "title")]/a/@href').extract()[0]
72             item['RelativeGroups'].append(url)
73         #item['RelativeGroups'] = ','.join(relative_groups)
74         return item<span><span style="line-height:20px;"> </span></span>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要爬取豆瓣的多页数据,可以使用Scrapy框架,并且需要了解一些XPath语法。 首先,打开豆瓣电影的页面,可以看到每一页的URL都有一个类似于这样的格式:https://movie.douban.com/top250?start=25&filter= 。其中,start参数表示从第几个电影开始,每页显示25个电影。所以,我们可以通过改变start参数的值来获取不同页的电影数据。 接下来,我们可以创建一个Scrapy项目,并且在spider中编写爬虫代码。代码如下: ```python import scrapy class DoubanSpider(scrapy.Spider): name = "douban" allowed_domains = ["douban.com"] start_urls = [ "https://movie.douban.com/top250" ] def parse(self, response): # 获取下一页的URL,并交给parse继续抓取数据 next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: url = response.urljoin(next_page[0].extract()) yield scrapy.Request(url, self.parse) # 解析当前页面的电影数据 for movie in response.xpath('//div[@class="info"]'): yield { 'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(), 'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(), 'quote': movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first(), } ``` 在这个代码中,我们首先定义了爬虫的名称、允许爬取的域名和起始URL。然后,在parse方法中,我们先获取下一页的URL,并通过yield关键字交给Scrapy继续抓取数据。接着,我们使用XPath语法解析当前页面的电影数据,并通过yield关键字将数据返回。最后,Scrapy会将所有的数据保存到一个JSON文件中。 最后,我们可以在终端中运行以下命令来启动Scrapy爬虫: ``` scrapy crawl douban -o douban.json ``` 这个命令会启动名为douban的爬虫,并将所有数据保存到douban.json文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值