【问题标题】:Loading more content in a webpage and issues writing to a file在网页中加载更多内容并写入文件时出现问题
【发布时间】:2025-11-25 15:35:01
【问题描述】:

我正在从事一个网络抓取项目,该项目涉及根据搜索词从网站抓取 URL,将它们存储在 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')
    

【问题讨论】:

  • 为什么要使用美汤而不仅仅是lxml? *.com/questions/5493514/… --edit-- 因为升级了:*.com/questions/4967103/…
  • get_url_for_search_key 期间,中间有一个return 语句,这意味着该函数的其余部分(在return 下)总是被忽略...
  • @OferSadan 我尝试更改 return 语句的位置。但我无法附加新链接。只抓取前十个链接。
  • @RvdBerg 谢谢你。对它有一个很好的了解,但我不知道我必须对我的代码进行什么样的更改。

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


【解决方案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 或文本中提取url,然后发出second 请求。我把它留给你。

【讨论】:

  • @Coldspeed :将模式更改为 a+。仍然读取 csv 文件中最后一个链接的内容并将其打印在“ctp_output.txt”中。其他链接不读。
  • @Rrj17 您的缩进已关闭。抱歉,没注意。
  • @coldspeed - 已修复。希望现在没事。
【解决方案2】:

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

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

不幸的是,没有神奇的子结果导航选项.... 但这非常接近:)。

祝你好运。

【讨论】: