【问题标题】:File Storage Problem with Python Web CrawlerPython Web Crawler 的文件存储问题
【发布时间】:2011-08-18 14:53:11
【问题描述】:

我正在使用网络爬虫进行屏幕抓取数据并将结果(来自推特页面的推文)存储为我正在爬取的每个用户的单独 html 文件。我打算稍后解析 html 文件并将数据存储到数据库中进行分析。但是,我遇到了一个奇怪的问题。

当我运行以下程序时——来自整个爬虫的一个小 sn-p——我能够为每个关注者获取一个单独的 html 文件:

import re
import urllib2
import twitter

start_follower = "NYTimesKrugman"
depth = 3

searched = set()

api = twitter.Api()

def crawl(follower, in_depth):
    if in_depth > 0:
        searched.add(follower)
        directory = "C:\\Python28\\Followertest1\\" + follower + ".html"
        output = open(directory, 'a')
        output.write(follower)
        output.write('\n\n')
        users = api.GetFriends(follower)
        names = set([str(u.screen_name) for u in users])
        names -= searched
        for name in list(names)[0:5]:
            crawl(name, in_depth-1) 

crawl(start_follower, depth)

for x in searched:
    print x
print "Program is completed."

但是,当我运行完整的爬虫时,我没有为每个关注者获得单独的文件:

import twitter
import urllib
from BeautifulSoup import BeautifulSoup
import re
import time

start_follower = "NYTimeskrugman" 
depth = 2
searched = set()

api = twitter.Api()


def add_to_U(user):
    U.append(user)

def site(follower): #creates a twitter site url in string format based on the follower username
    followersite = "http://mobile.twitter.com/" + follower
    return followersite

def getPage(follower): #obtains access to a webapge
    url = site(follower)
    response = urllib.urlopen(url)
    return response

def getSoup(response): #creates the parsing module
    html = response.read()
    soup = BeautifulSoup(html)
    return soup

def gettweets(soup, output):
    tags = soup.findAll('div', {'class' : "list-tweet"})#to obtain tweet of a follower
    for tag in tags: 
        a = tag.renderContents()
        b = str (a)
        output.write(b)
        output.write('\n\n')

def are_more_tweets(soup):#to check whether there is more than one page on mobile twitter 
    links = soup.findAll('a', {'href': True}, {id: 'more_link'})
    for link in links:
        b = link.renderContents()
        test_b = str(b)
        if test_b.find('more') != -1:
            return True
    return False

def getnewlink(soup): #to get the link to go to the next page of tweets on twitter 
    links = soup.findAll('a', {'href': True}, {id : 'more_link'})
    for link in links:
        b = link.renderContents()
        if str(b) == 'more':
            c = link['href']
            d = 'http://mobile.twitter.com' +c
            return d

def crawl(follower, in_depth): #main method of sorts
    if in_depth > 0:
        searched.add(follower)
        directory = "C:\\Python28\\Followertest2\\" + follower + ".html"
        output = open(directory, 'a')
        output.write(follower)
        output.write('\n\n')
        a = getPage(follower)
        soup = getSoup(a)
        gettweets(soup, output)
        tweets = are_more_tweets(soup)
        while(tweets): 
            b = getnewlink(soup)
            red = urllib.urlopen(b)
            html = red.read()
            soup = BeautifulSoup(html)
            gettweets(soup, output)
            tweets = are_more_tweets(soup)
        users = api.GetFriends(follower)
        names = set([str(u.screen_name) for u in users])
        names -= searched
        for name in list(names)[0:5]:
            print name
            crawl(name, in_depth - 1)

crawl(start_follower, depth)
print("Program done. Look at output file.")

更具体地说,我似乎为大约前五个关注者获得了一个单独的 html 文件,然后似乎没有创建新文件。任何帮助,将不胜感激!

【问题讨论】:

  • 我知道这可能对您的问题没有帮助 - 但不久前我在 twitter 上进行数据挖掘,请问您为什么不只是使用 API?
  • 啊..我正在使用 API 获取用户的好友列表,但由于速率限制,我不想使用 API 获取推文。我相信使用当前代码(鉴于爬虫必须暂停以获取用户的所有推文),我不会超过当前的速率限制。
  • @NED Python 28?这只是我选择存储爬取数据的文件目录。
  • 啊,是的,我遇到了同样的问题 - 所以你可以做的是使用 Apigee,他们可以连接到 Twitter,你可以免费获得每小时 20000 个电话 - apigee.com/console/… - 如果你想去那条路线。
  • @ eWizard - 感谢您的链接......但在我尝试另一条路线之前,我当前的代码在爬行和记录数据方面工作正常。但是,我遇到的唯一问题是数据存储。您认为您知道一种好的存储方法吗?或者理想情况下,您能就我的问题提出一些建议吗?

标签: python web-crawler


【解决方案1】:

sn-p 和完整代码之间的depth 值是不同的(在完整代码中您只会获得一级递归)。此外,您只从关注者列表中获取前五个名称:for name in list(names)[0:5]: 所以您总共有六个人:初始关注者和他们的前五个朋友。

【讨论】:

  • 天哪。我觉得很傻......好吧,让我试着调整一下,看看我得到了什么......啊!
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2022-01-15
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多