网页抓取每个论坛帖子(Python,Beautifulsoup)

时间:2017-03-02 13:41:11

标签: python web-scraping pycharm nested-loops

你好再次堆叠他们的伙伴。简短说明..我正在使用Python从汽车论坛上抓取一些数据并将所有数据保存到CSV文件中。在其他stackoverflow成员的帮助下,设法通过浏览特定主题的所有页面,收集每个帖子的日期,标题和链接。

我还有一个单独的脚本我现在正在实施(对于发现的每个链接,python为它创建一个新汤,擦过所有帖子,然后返回到上一个链接)。

非常感谢有关如何使其变得更好的任何其他提示或建议,因为它是我第一次使用python时,我认为这可能是我的嵌套循环逻辑搞砸了,但是通过检查多次似乎对我而言。

下面是代码段:

        link += (div.get('href'))
        savedData += "\n" + title + ", " + link
        tempSoup = make_soup('http://www.automotiveforums.com/vbulletin/' + link)
        while tempNumber < 3:
            for tempRow in tempSoup.find_all(id=re.compile("^td_post_")):
                for tempNext in tempSoup.find_all(title=re.compile("^Next Page -")):
                    tempNextPage = ""
                    tempNextPage += (tempNext.get('href'))
                post = ""
                post += tempRow.get_text(strip=True)
                postData += post + "\n"
            tempNumber += 1
            tempNewUrl = "http://www.automotiveforums.com/vbulletin/" + tempNextPage
            tempSoup = make_soup(tempNewUrl)
            print(tempNewUrl)
    tempNumber = 1
    number += 1
    print(number)
    newUrl = "http://www.automotiveforums.com/vbulletin/" + nextPage
    soup = make_soup(newUrl)

到目前为止我的主要问题是tempSoup = make_soup('http://www.automotiveforums.com/vbulletin/' + link) 在完成论坛帖子的所有帖子之后,似乎没有创建新的汤。

这是我得到的输出:

 http://www.automotiveforums.com/vbulletin/showthread.php?s=6a2caa2b46531be10e8b1c4acb848776&t=1139532&page=2
    http://www.automotiveforums.com/vbulletin/showthread.php?s=6a2caa2b46531be10e8b1c4acb848776&t=1139532&page=3
    1

所以它确实找到了新页面的正确链接并抓取它们,但是对于下一次尝试,它会打印新日期和相同的页面。在打印完最后一个链接之后,还有一个非常奇怪的10-12秒延迟,然后它跳下来打印1号然后抨击所有新日期..

但是在进入下一个论坛帖子链接之后,它每次都会搜索相同的确切数据。

很抱歉,如果它看起来非常混乱,那是一个侧面项目,我第一次尝试做一些有用的事情,所以我对此很新,任何建议或提示都会非常感激。我不是要求你为我解决代码,即使是对我可能错误的逻辑的一些指示也会非常感激!

亲切的问候,感谢您阅读这么烦人的长篇文章!

编辑: 我已经删除了大部分帖子/代码段,因为我相信人们已经不堪重负。刚离开我正在尝试使用的基本位。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

所以在花了一点时间之后,我已经设法将ALMOST破解了。它现在处于python发现每个线程及其在论坛上的链接的点,然后进入每个链接,读取所有页面并继续下一个链接。

如果有人会使用它,这是它的固定代码。

    link += (div.get('href'))
    savedData += "\n" + title + ", " + link
    soup3 = make_soup('http://www.automotiveforums.com/vbulletin/' + link)
    while tempNumber < 4:
        for postScrape in soup3.find_all(id=re.compile("^td_post_")):
            post = ""
            post += postScrape.get_text(strip=True)
            postData += post + "\n"
            print(post)
        for tempNext in soup3.find_all(title=re.compile("^Next Page -")):
            tempNextPage = ""
            tempNextPage += (tempNext.get('href'))
            print(tempNextPage)
        soup3 = ""
        soup3 = make_soup('http://www.automotiveforums.com/vbulletin/' + tempNextPage)
        tempNumber += 1
    tempNumber = 1
number += 1
print(number)
newUrl = "http://www.automotiveforums.com/vbulletin/" + nextPage
soup = make_soup(newUrl)

我所要做的就是将2个嵌套在一起的循环分离到自己的循环中。仍然不是一个完美的解决方案,但嘿,它几乎可以工作。

非工作位:提供的链接的前2个帖子有多页帖子。以下10多个线程不要。我无法找到检查for tempNext in soup3.find_all(title=re.compile("^Next Page -")):的方法 循环外的值,看它是否为空。因为如果它没有找到下一个页面元素/ href,它只使用最后一个。但是如果我在每次运行后重置该值,它就不再挖掘每一页= l一个刚刚创建另一个问题的解决方案:D。

答案 1 :(得分:0)

非常感谢亲爱的 Norbis 分享您的想法、见解和概念

由于您只提供了一个片段,我只是尝试提供一种方法来展示如何登录到 phpBB - 使用有效负载:

import requests
forum = "the forum name"

headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username': 'username', 'password': 'password', 'redirect':'index.php', 'sid':'', 'login':'Login'}
session = requests.Session()

r = session.post(forum + "ucp.php?mode=login", headers=headers, data=payload)
print(r.text)

等一下:我们可以 - 而不是使用请求来操纵网站, 还可以使用诸如 mechanize 之类的浏览器自动化提供此功能。 这样我们就不必管理自己的会话,只需几行代码来制作每个请求。

一个有趣的例子在 GitHub https://github.com/winny-/sirsi/blob/317928f23847f4fe85e2428598fbe44c4dae2352/sirsi/sirsi.py#L74-L211