在网页中加载更多内容并发出写入文件的问题

时间:2017-07-19 09:13:48

标签: python python-2.7 csv web-scraping beautifulsoup

我正在开展网络抓取项目,该项目涉及根据搜索字词从网站抓取网址,将其存储在CSV文件中(在单个列下),最后从这些链接中抓取信息并将其存储在文本中文件。

我目前遇到了两个问题。

  1. 只抓取前几个链接。我无法提取链接 从其他页面(网站包含加载更多按钮)。我不知道 如何在代码中使用XHR对象。
  2. 代码的后半部分只读取最后一个链接(存储在 csv文件),抓取相应的信息并将其存储在一个 文本文件。它从一开始就没有经过所有的链接。 我无法弄清楚我在文件方面出了什么问题 处理和f.seek(0)。

    from pprint import pprint
    import requests
    import lxml
    import csv
    import urllib2
    from bs4 import BeautifulSoup
    
    def get_url_for_search_key(search_key):
        base_url = 'http://www.marketing-interactive.com/'
        response = requests.get(base_url + '?s=' + search_key)
        soup = BeautifulSoup(response.content, "lxml")
        return [url['href'] for url in soup.findAll('a', {'rel': 'bookmark'})]
        results = soup.findAll('a', {'rel': 'bookmark'})
    
    for r in results:
        if r.attrs.get('rel') and r.attrs['rel'][0] == 'bookmark':
            newlinks.append(r["href"])
    
    pprint(get_url_for_search_key('digital advertising'))
    with open('ctp_output.csv', 'w+') as f:
        f.write('\n'.join(get_url_for_search_key('digital advertising')))
        f.seek(0)  
    

    读取CSV文件,抓取相应内容并存储在.txt文件中

    with open('ctp_output.csv', 'rb') as f1:
        f1.seek(0)
        reader = csv.reader(f1)
    
        for line in reader:
            url = line[0]       
            soup = BeautifulSoup(urllib2.urlopen(url))
    
            with open('ctp_output.txt', 'a+') as f2:
                for tag in soup.find_all('p'):
                    f2.write(tag.text.encode('utf-8') + '\n')
    

2 个答案:

答案 0 :(得分:1)

关于您的第二个问题,您的模式已关闭。您需要将w+转换为a+。另外,你的缩进是关闭的。

with open('ctp_output.csv', 'rb') as f1:
    f1.seek(0)
    reader = csv.reader(f1)

    for line in reader:
        url = line[0]       
        soup = BeautifulSoup(urllib2.urlopen(url))

        with open('ctp_output.txt', 'a+') as f2:
            for tag in soup.find_all('p'):
                f2.write(tag.text.encode('utf-8') + '\n')

如果文件不存在,+后缀将创建该文件。但是,w+将在每次迭代写入之前擦除所有内容。另一方面,a+将附加到文件(如果存在),或者创建文件(如果不存在)。

对于您的第一个问题,除了切换到可以自动点击浏览器按钮等的东西之外别无选择。你必须看看硒。另一种方法是手动搜索该按钮,从href或文本中提取网址,然后发出第二个请求。我把它留给你。

答案 1 :(得分:1)

如果有更多包含结果的页面,请在手动单击以转到结果的下一页时观察URL中的更改。 我可以保证100%一小部分URL将有一个子页面编号或其中编码的其他变量与子页面严格相关。 一旦你弄清楚你刚刚把它放到一个for循环中的组合是什么,你将一个.format()放到你想要抓取的URL中,并继续以这种方式导航到结果的所有子页面。

至于最后一个子页码是什么 - 你必须检查你正在抓取的网站的html代码,找到负责它的变量并提取它的值。看看是否有" class":" Page"或者代码中的等价物 - 它可能包含你的for循环所需的那个数字。

不幸的是,通过subresults选项没有神奇的导航.... 但这非常接近:)。

祝你好运。