【发布时间】:2011-07-19 17:22:11
【问题描述】:
我要开发一个小爬虫,它会从同一个网站获取很多页面,所有的请求都是 url 的 ID 号的变化。
我需要将我要解析的所有数据保存到一个csv中(没什么花哨的),最多我会爬大约6M-8M的页面,其中大部分不包含我想要的数据,我知道那里我需要解析大约 400K 个页面,它们的结构都相似,我无法避免爬取所有的 url。
这就是我获取数据时页面的外观 - http://pastebin.com/3DYPhPRg
那是我没有得到数据的时候 - http://pastebin.com/YwxXAmih
数据保存在 td 内部的 span 中 -
I need the data between ">" and "</span>".
<span id="lblCompanyNumber">520000472</span></td>
<span id="lblCompanyNameHeb">חברת החשמל לישראל בעמ</span></td>
<span id="lblStatus">פעילה</span></td>
<span id="lblCorporationType">חברה ציבורית</span></td>
<span id="lblGovCompanyType">חברה ממשלתית</span></td>
<span id="lblLimitType">מוגבלת</span></td>
etc'
从文档中解析出来并不难。
问题是获取url并解析它们需要几天的时间,它会消耗大量内存,我认为它会时不时地崩溃,这对我来说非常危险,它可以'除非它不能再运行,否则不会崩溃。
我想过-
- fetching a url (urllib2)
- if there's an error - move next (if it'll happen 5 times - I stop and save errors to log)
- parse the html (still don't know whats best - BeautifulSoup \ lxml \
scrapy \ HTMLParser etc')
- if it's empty (lblCompanyNumber will be empty) save the ID in the emptyCsvFile.csv
- else: save the data to goodResults.csv
问题是 -
- 我应该使用哪些数据类型以提高效率和速度(对于我解析的数据和获取的内容)?
- 我应该使用哪个 HTML 解析库?也许正则表达式? span id 是固定的,当有数据时不会改变(再次强调,高效、速度、简单)
- 保存到文件,长时间保存文件的句柄等' - 有没有一种方法可以节省资源并更有效地保存数据? (至少 40 万行)
- 任何其他我没有想到但需要处理的事情,也许还有一些优化技巧 :)
我想到的另一个解决方案是使用 wget,将所有页面保存到磁盘,然后删除所有具有相同 md5sum 的空文档的文件,唯一的问题是我没有保存空 ID。
顺便说一句,我需要使用 py2exe 并用它制作一个 exe,所以像 scrapy 这样的东西在这里可能很难使用(已知会导致 py2exe 出现问题)。
谢谢!
【问题讨论】:
标签: python html-parsing web-crawler