• Python网络爬虫3 – 使用BeautifulSoup解析网页

    在第一节演示过如何使用正则表达式截取网页内容。不过html是比正则表达式更高一级的语言,仅仅使用正则表达式来获取内容还是有些困难的。 这次会使用一个新的工具:python的BeautifulSoup库,BeautifulSoup是用来从HTML或XML文件中提取数据的工具。 BeautifulSoup需要先安装才能使用。关于BeautifulSoup安装和使用可以参考这份文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/。 打开我们的搜索结果页https://www.torrentkitty.tv/search/蝙蝠侠/。此时最好使用chrome浏览器,因为chrome浏览器的Developer Tools(类似FireBug)有一个功能可以获取CSS选择器(选中目标 –> Copy –> Copy selector),这是很有用的(有的时候也会出现问题,不过还是可以用来做参考的)。 先使用BeautifulSoup获取title试试: 很简单不是。这里是用了CSS选择器来获取HTML中的内容。 在搜索结果中,点击每个结果项右侧的“open”按钮可以打开下载。使用DeveloperTools可以看到“open”按钮实际上是一个超链接,超链接指向的是一个磁力链接。这个磁力链接就是我们要采集的目标。使用Chrome的DeveloperTools的选择器选中任意一个“open”按钮,然后在Elements项中,找到我们选中的项的源码(很容易找到,选中项的背景是蓝色的),右键 –> Copy –> Copy selector可以获取到这个按钮的CSS选择器: 将这个选择器放到代码中却是不生效的: 执行结果输出的是0。soup.select()方法返回的是一个列表,长度为0……好像不用解释了。 python是不支持上面的选择器的部分语法的,比如nth或者tbody,修改下就可以了: 直接执行上面的代码就可以得到一个超链接的源码: 超链接中的href和title属性就是我们的目标。BeautifulSoup也提供了获取属性的方案,select方法返回的每个值中都包含一个attrs字典,可以从字典中获取到相关的属性信息: 好了,大体就是这样。 不过程序中最难看的就是获取超链接的方案:一个一个地获取是不可能。好在BeautifulSoup支持通过属性的值来获取对象,最后调整下就是这样子了: 上面的代码中的a[href^=”magnet:?xt”]表示查询的是所有<a>标签,且<a>标签的href属性需要以“magnet:?xt”开头。(看到“^”有没有觉得熟悉,这个“^”和正则式中的“^”意义是一样的)。通过这个select方法得到<a>标签列表,然后遍历标签列表,从标签的attrs字典中读取到相关的属性信息。 完整的代码如下: ###############

    [阅读更多...]
  • Python网络爬虫2 – 请求中遇到的几个问题

    这次尝试下怎样搜索电影并解析出磁力链接信息。 搜索的网址是:https://www.torrentkitty.tv/search/。 开始了! 使用FireFox打开上面的网址,输入要搜索的电影。在点击搜索按钮前记得打开FireBug,并激活“网络”页签。 查看了请求的详情有些哭笑不得:点击搜索按钮后网页跳转到了这样的地址:https://www.torrentkitty.tv/search/蝙蝠侠/——很明显的REST风格的请求。这样,我们要搜什么内容直接将要搜索的内容拼装到请求地址中就行了。搜索的代码是这样的: 执行后报错了,报错信息如下: 根据错误栈信息可以看出是在发送http请求时报错的,是因为编码导致的错误。在python中使用中文经常会遇到这样的问题。因为是在http请求中出现的中文编码异常,所以可以考虑使用urlencode加密。 在python中对字符串进行urlencode使用的是parse库的quote方法,而非是urlencode方法: 再次执行请求,依然报错了: 报的是HTTP 403错误。这样的错误我遇到过几次,一般是因为没有设置UserAgnet,是网站屏蔽爬虫抓取的一种方式。通过FireBug可以从headers中获取到User-Agent信息: 获取到header信息后再调整下我们的代码,这次会需要使用一个新的类Request: 修改后依然在报错: 请求超时了,估计是因为网站在境外的缘故。所以还需要设置一个请求超时时间,只需要添加一个参数: 这样调整后终于请求成功了。需要强调下,这里的超时设置的时间单位是秒。 总结下吧,这次一共遇到了三个问题: 中文编码的问题; HTTP403错误的问题; 请求超时时间设置的问题。 完整的代码在这里,稍稍作了些调整,还添加了post请求的代码。在pot请求的代码中对字典型的参数调用了urlencode方法: 就是这样。这次本来是想说些关于网页解析的内容的,不过后来发现还是有很多的内容需要先说明下才好进行下去。关于网页解析的内容就挪到了下一节。 这里有篇文章不错,说明了urllib中几个常见的问题:http://www.cnblogs.com/ifso/p/4707135.html ##########

    [阅读更多...]