如何在BS4中有效地抓取多个URL

时间:2018-04-03 20:05:10

标签: python python-3.x web-scraping beautifulsoup

我试图找到一种在BS4中刮取多个页面的有效方法。我能够轻松地抓住第一页并获取我需要的所有数据,但遗憾的是,并非所有数据都在其上。有两个其他页面要刮,而不是硬编码这个并改变第二页和第三页的URL我想知道是否有更优雅的方式在Python中使用BS4。需要更改的URL的唯一部分是page = 1到相应的页码(1,2,3)。

netsh.exe interface ipv4 set interface "myNICsName" metric=20

4 个答案:

答案 0 :(得分:1)

这是网络抓取的一个难点。 BS4无法帮助您生成逻辑以优雅地获取URL并预测您需要的数据将驻留在网站上的哪个位置。每个网站都不同,后端遵循不同的规则。

您可以做的最好的事情就是查看网站本身并尽力识别模式并根据网页上的内容动态提取网址。这种逻辑的优雅取决于你,并且在很大程度上取决于你正在抓取的网站。

答案 1 :(得分:1)

遍历页码。 itertools.count派上用场:

import itertools

for index in itertools.count(start=1):
    url = "https://www.congress.gov/members?q={%22congress%22:%22115%22}&pageSize=250&page="+str(index)

    # the rest of your code

答案 2 :(得分:1)

你可以用同样的方法做几件事。在这种情况下,更好的方法是将最后一页数作为最高范围。该网页以三个不同的页面显示文档,最高页数为3。但是,如果您搜索https://www.congress.gov/members?q=%7B%22congress%22%3A%22115%22%7D&pageSize=250&page=5,您可以看到网页仍显示数据,而第3页的数据库已用完。因此,定义最后一个页码(加1)是您应该做的这里。

import requests
from bs4 import BeautifulSoup

my_url = "https://www.congress.gov/members?q=%7B%22congress%22%3A%22115%22%7D&pageSize=250&page={}"
for link in [my_url.format(page) for page in range(1,4)]:
    res = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
    soup = BeautifulSoup(res.text, "lxml")
    for item in soup.select(".expanded"):
        name = item.select_one(".result-heading a").text
        print(name)

答案 3 :(得分:0)

如果你知道最后一页的索引只是像上面的答案中提出的那样迭代。如果最后一页索引未知 - 使用while循环和逻辑来决定是否继续刮下一页或不。

import csv 
import requests
from bs4 import BeautifulSoup


url = "https://www.congress.gov/members?q={%22congress%22:%22115%22}&pageSize=250&page="
headers = {'User-Agent': 'Mozilla/5.0'}
pageId = 0

while True:
    pageId = pageId + 1
    print ("Processing page " + str(pageId))
    response = requests.get(url+str(pageId), headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")

    names = soup.find_all()
    if len(name) == 0:
        break

    items = soup.find_all("li","expanded")
    for item in items:
        print(item.text)
        print(item.find("a"))
        with open('web.csv', 'a') as csv_file:
            writer = csv.writer(csv_file)
            writer.writerow([item.find("a").encode('utf-8')])