网页数据抓取怎么写(一个英语学习爱好者.1.3破解激活,IntelliJ会写代码吟诗的架构师)
优采云 发布时间: 2022-01-13 22:07网页数据抓取怎么写(一个英语学习爱好者.1.3破解激活,IntelliJ会写代码吟诗的架构师)
作为一个英语学习爱好者,我发现我们学了这么多年英语。虽然现在读英文文章不是很困难,但是如果我自己想写英文文章,总觉得单词虽然看懂了,但是很难拼出一个水平的句子. 我认为的原因是我们通常这样做
强烈推荐IDEA2021.1.3破解激活,IntelliJ IDEA注册码,2021.1.3IDEA激活码
大家好,我是建筑师,一个会写代码,会背诗的建筑师。今天就来说说用网络爬虫为自己写一个英语学习工具,希望能帮助大家提高!!!
作为一个英语学习爱好者,我发现我们学了这么多年英语。虽然现在读英文文章不是很困难,但是如果我自己想写英文文章,总觉得单词虽然看懂了,但是很难拼出一个水平的句子. 我认为的原因是,虽然我们平时阅读量很大,但我们只是被动地将英文信息转化为大致的中文意思理解,而不是试图训练如何从中文到英文表达。成为程序员的好处之一是,当你发现需要时,你可以尝试制作一些东西来和自己一起玩。为了做这个学习工具,我首先想到了一些新闻网站会提供双语新闻(比如酷游网),然后我的想法就简单的形成了,首先创建一个网络爬虫,抓取一些双语新闻网页,然后提取每个中英文句子,然后制作图形界面,每次显示一条消息。中文,让用户尝试输入英文翻译,写不出来可以查看英文原版提示,并提供笔记功能,记录特殊词汇、表达和经验等。这些功能一一实现。
1 网页抓取框架-scrapy
所谓网络爬虫,其实就是我们使用的浏览器。它访问一个链接,然后下载相应的网页。不同的是,浏览器下载文件后呈现一个页面,而爬虫可以根据我们定义的规则,自动访问网站中的链接,然后处理下载的web文件,提取我们想要的数据. 如果要自己实现一个网络爬虫,需要自己编写一个模拟的http客户端,实现文本解析等功能,比较麻烦。此时,您可以找到任何有用的开源软件。Scrapy() 是一个非常好的工具。它是一个使用 python 的快速和先进的网络抓取框架。使用时只需要简单定义你要抓取的网页的url,而对于每次抓取页面需要进行的处理操作,剩下的都可以通过scrapy来完成。感兴趣的朋友可以看看它提供的tutorial(),现在就开始我们的工作吧。
(1)安装scrapy后,在shell终端下任意目录运行命令:
scrapy startproject 双语(项目名称自行取)
得到如下图的项目结构
bilingual/
scrapy.cfg
bilingual/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
只听山间传来建筑师的声音:
江水流泉至尽,月落江塘。谁将向上或向下匹配?
Scrapy 提供这些文件以允许我们自定义处理捕获的数据。spiders 目录用于存储用户定义的蜘蛛类。Scrapy 根据此处定义的类捕获信息。在spider类中,需要定义初始的url列表,以及抓取新链接的规则以及如何解析提取下载的网页信息。为简单起见,我只在spiders目录下写了一个spider进行处理,并没有使用其他功能。
(2)在spiders目录下,创建文件cuyoo.py(自定义的spider名称,即要捕获的网站的名称),代码如下
此代码由Java架构师必看网-架构君整理
1 from scrapy.selector import HtmlXPathSelector
2 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
3 from scrapy.contrib.spiders import CrawlSpider, Rule
4
5 import codecs
6 import os
7
8 class CuyooSpider(CrawlSpider):
9 name = 'cuyoo'
10 allowed_domains = ['cuyoo.com']
11 start_urls = [
12 'http://www.cuyoo.com/home/portal.php?mod=list&catid=2']
13
14 rules = (
15 Rule(SgmlLinkExtractor(allow=r'.*mod=view_both.*'), callback=‘parse_item',
follow=False),
16 )
17
18 def __init__(self, *arg, **kwargs):
19 super(CuyooSpider, self).__init__(*arg, **kwargs)
20 self.output = codecs.open("data", "wb", "utf-8")
21
22 def __del__(self):
23 self.output.close()
24
25 def parse_item(self, response):
26 hxs = HtmlXPathSelector(response)
27 title = hxs.select("//h4[@class='ph']/text()").extract()
28 english = hxs.select('//div[@id="en"]/text()').extract()
29 chinese = hxs.select('//div[@id="cn"]/text()').extract()
30 self.output.write("---" + title[0].strip() + "---")
31 self.output.write(os.linesep)
32 for i in range(len(english)):
33 self.output.write(chinese[i].strip())
34 self.output.write("->")
35 self.output.write(english[i].strip())
36 self.output.write(os.linesep)
稍微解释一下,在上面的蜘蛛中,我在star_urls成员中放了一个链接,打开这个链接可以看到如下网页:
可以看到,在这个网页中有多个新闻链接,每个链接点击双语对照可以得到中英文对照版的新闻,查看源代码可以看出其链接形式为:portal.php?mod=view_both&aid=19076,所以在rules里定义规则
Rule(SgmlLinkExtractor(allow=r'.*mod=view_both.*'), callback=‘parse_item',follow=False)
用正则表达式表示包含'mod=view_both’的链接,scrapy在访问该网页时,就会自动抓取符合所定义的规则的所有链接,这样就将这一页里的所有中英文对照的新闻都抓取了下来,然后对每个抓取到的网页调用parse_item(self, response)进行处理
(3) 因为我们要的只是网页里的中英文新闻内容,所以要对下载到的网页进行信息抽取,scrapy提供了XPath查找功能,让我们可以方便地抽取文档节点内容,不了解XPath可以看看W3C的教程(http://www.w3school.com.cn/xpath/),要抽取信息,首先还是要分析该新闻网页的结构,可以使用scrapy提供的命令行工具来分析网页结构和试验xpath语句,首先运行命令
此代码由Java架构师必看网-架构君整理
scrapy shell 'http://www.cuyoo.com/home/portal.php?mod=view_both&aid=19076'
将网页下载下来后,再输入view(response),可在浏览器查看下载到的网页
可以看出,新闻的两种格式分别包含在两个div中,一个id为en,另一个为cn,所在在parse_item()中,分别使用
hxs.select('//div[@id="en"]/text()').extract() 和 hxs.select('//div[@id="cn"]/text()').extract()
将内容抽取出来,并按格式写到文件中。
(4)在项目目录下运行 scrapy crawl cuyoo 开始抓取,最终得到如下图所示意的文件
2 图形界面
使用捕获的数据,您可以自由地播放您接下来想做的事情。我的图形界面是通过 Qt 实现的。我个人认为它非常方便且易于使用。.
程序界面
选择文章
查看提示
最后,还有一个尚未实现的笔记功能。本来想用印象笔记SDK直接在印象笔记上写笔记的,但是因为他们的SDK的C++版本没有教程文档,貌似账号有点复杂。,或者等到以后再找时间实施。
3 总结
这样做我得到了两分。首先,它让我觉得编程其实很有用,不局限于工作和学习。只要我们有想法,我们就可以做很多事情。第二个是关于开源软件。现在有很多开源软件。使用开源的东西非常方便有趣。同时,我们也可以参与到使用的过程中。比如我在使用scrapy的时候,上面提到过。这样的命令
scrapy shell 'http://www.cuyoo.com/home/portal.php?mod=view_both&aid=19076'
一开始我的链接没用引号括起来,因为&在shell里是个特殊符号,表示后台运行,所以链接里的第二个参数在运行的时候就没了,后来想明白后,问题解决了,我觉得这个问题别人可能也会遇到,所以就在scrapy的github页面上给提了这个问题,希望他们能加到tutorial文档里,然后过了一两天,他们就真的加上了,这让我感到很高兴,也很佩服。
好了,写得好长,谢谢观看~
今天文章结束,感谢阅读,Java架构师必看,祝你升职加薪,年年好运。