时间:2018年12月
网站:百分网
内容:爬取整篇文章,并写入txt文档
因为需要用到一些文章,要下载森林防火主题班会教案的整篇内容,但是复制的时候被网站弹出窗口给屏蔽了。所以用scrapy把他们都爬出来,并写入txt文档。
代码写好了爬出来有个缺点,就是黑体字放在p标签里面的strong,没办法和p/text()一起拿到,
换作string来达到目的:
要把 标签下的所有文本提取出来,并放入同一个字符串中,可以使用xpath的string()方法,另外,在xpath语法里面,点(.)表示当前节点
import scrapy
import re
from jiaoan.items import JiaoanItem
class DemoSpider(scrapy.Spider):
name = 'demo'
start_urls = ['http://www.oh100.com/kaoshi/jiaoan/261501.html']
def parse(self, response):
"""
txt = response.xpath('//div[@class="content"]//p/text()').extract()
for each_txt in txt:
item = JiaoanItem()
item['txt'] = each_txt
yield item
print(item) 这样写只能获得正文部分,提取不到黑体字
"""
txt = response.xpath('//div[@class="content"]')
text = txt.xpath('string(.)').extract()
content = ""
item = JiaoanItem()
for i in text:
content += str(i.strip())
item['txt'] = i.strip()
print('*****************n%sn******************'%content)
yield item
接下来又发现一个问题,那就是这样的爬取方式把网页最后一段黑体字也爬进去了,而这个又是不需要的:
于是在写入txt的过程中在pipelines.py用正则表达式排除掉:
import codecs
import os
import re
class JiaoanPipeline(object):#需要在setting.py里设置'coolscrapy.piplines.CoolscrapyPipeline':300
def process_item(self, item, spider):
# 获取当前工作目录
base_dir = os.getcwd()
fiename = base_dir + '/jiaoan.txt'
# 从内存以追加的方式打开文件,并写入对应的数据
with open(fiename, 'a') as f:
text = str(item['txt']).replace('n', '@@')
text = re.findall('(.*)更多防火安全', text)[0]
text = str(text).replace('@@', 'n')
f.write(text)
return item
最终成功爬取到txt:
本文特别感谢经典之路的指导!