|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import scrapy
- import re
- # CMD 运行
- # scrapy runspider cnblog_spider.py -o cnblog.csv
- class CnblogSpider(scrapy.Spider):
- name='cnblog'
- allowed_domains = ['https://www.cnblogs.com/']
- start_urls=['http://www.cnblogs.com/pick/#p%s'% id for id in range(1,21)]
-
- def parse(self,response):
- allblog= response.xpath('//div[@class="post_item"]')
- for each in allblog:
- dignum=int(each.xpath('div[@class="digg"]/div/span/text()')[0].extract())
- titlename=each.xpath('div[@class="post_item_body"]/h3/a/text()')[0].extract()
- content=each.xpath('div[@class="post_item_body"]/p/text()')[0].extract().replace(r'\r','').replace(r'\n','').strip()
- postname=each.xpath('div[@class="post_item_body"]/div/a/text()')[0].extract()
- comment=each.xpath('div[@class="post_item_body"]/div/span[1]/a/text()')[0].extract().strip()
- p1=r'评论\((\d+)\)'
- comnum=int(re.findall(p1,comment)[0])
- view=each.xpath('div[@class="post_item_body"]/div/span[2]/a/text()')[0].extract().strip()
- p2=r'阅读\((\d+)\)'
- viewnum=int(re.findall(p2,view)[0])
- yield {'标题':titlename,发布者':postname,'点赞数':dignum,'评论数':comnum,'浏览数':viewnum,'内容':content}
复制代码
为啥爬出来 数据会重复-----不能按url规则索引
先说结果:你这个问题的原因我已经找到了,但是如何在scrapy中解决这个问题,我还没有完成。
下面简单说下过程:
首先我在scrapy下面发现,虽然start_urls被传送进去,但立刻就会给Dupefilter给过滤掉,我天真的以为Dupefilter可能因为网页的原因出现了一些不明故障,手动关掉之后,却又发现scrapy.core.engine和scrapy.core.scraper页面居然不同,scrapy.core.scraper始终固定在http://www.cnblogs.com/pick/ 上。由此,我开始怀疑这个网页url本身有问题。
我通过requests对你提供的网页进行链接,代码如下:
- r = requests.get('http://www.cnblogs.com/pick/#p1')
- print(r.text)
- r = requests.get('http://www.cnblogs.com/pick/#p2')
- print('===========================================')
- print(r.text)
复制代码
通过对比两次连接的结果后发现,http://www.cnblogs.com/pick/#p2 本身并不是真正链接。
最后通过F12发现,实际上,文章部分是给包装在一个Postlist.aspx里面的。于是传入参数有如下代码:
- import requests
- payload = {'CategoryType': "Picked", 'ParentCategoryId': 0, 'CategoryId': -2, 'PageIndex': 1, 'TotalPostCount': 1554}
- r = requests.get('http://www.cnblogs.com/pick/#p1', params=payload)
- print(r.text)
- payload = {'CategoryType': "Picked", 'ParentCategoryId': 0, 'CategoryId': -2, 'PageIndex': 2, 'TotalPostCount': 1554}
- r = requests.get('http://www.cnblogs.com/pick/#p2', params=payload)
- print('===========================================')
- print(r.text)
复制代码
对比后发现,这次得到的两个页面内容就不相同了,于是可以确定的是PageIndex这个参数才是确定页面的关键。
最后:
其实根据以上内容,相信你也可以明白,只要能够把上面payload部分的内容,通过scrapy参数传入就可以了。
但是我对scrapy确实不太熟,而我觉得scrapy又太过复杂,解决一个小的而又不常见问题需要去研究整个scrapy运行的机制,所以短期内也不会去研究这问题应该怎么处理。所以这只能留给你自己去解决了。如果你有了结论,希望你也能告知。
|
|