网页数据抓取怎么写(一个英语学习爱好者.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架构师必看,祝你升职加薪,年年好运。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线