刮掉网站后仅添加新链接

时间:2018-04-07 14:42:47

标签: python web-scraping beautifulsoup python-requests

我有一个代码,可以使用特定关键字抓取所有产品的链接,标题和尺寸。在完成第一次刮擦之后,如果添加了新项目,我希望一次又一次地检查脚本。我试试True:但它似乎不起作用,因为多次给我相同的数据。脚本是这样的:

import requests
import csv
from bs4 import BeautifulSoup
import time

headers = {"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 
Safari/537.36"}
keywords = ["nike", "air"]
base_url = "https://www.julian-fashion.com"

while True:
    for page in range(0,11):
        url = "https://www.julian-fashion.com/en-US/men/shoes/sneakerscurrPage={}".format(page)
        r = requests.get(url)
        soup = BeautifulSoup(r.content,"html.parser")
        all_links = soup.find_all("li", attrs={"class":"product in-stock"})
        for link in all_links:
            for s in keywords:
                if s not in link.a["href"]:
                    found = False
                    break
                else:
                    product = link.a["href"]
                    found = True
                    if found:
                        print("Product found.")
                        print(base_url+link.a["href"])
                        print(link.img["title"])
                        print(link.div.div.ul.text)

1 个答案:

答案 0 :(得分:0)

你在currPage之前缺少?,它应该是这样的:https://www.julian-fashion.com/en-US/men/shoes/sneakers?currPage={}?表示query string的开头。现在你的代码可以运行了。

您还可以省略页面0,因为此网站从1开始分页,并提供0404 Page not found。除此之外,您不需要while True,因为您只想执行此代码块一次。 <{1}}循环负责更改页面,这就足够了。

这里有一个错误:

For

如果关键字不在for s in keywords: if s not in link.a["href"]: found = False break 中,您就会从循环中断。请注意,如果您的列表中的第一个link.a['href']不存在,那么它并不代表下一个获胜者中的一个。

经过一些修复后的代码:

keyword

以下是我的代码版本,我使用.select()代替.find_all()。这样做更好,因为如果页面的创建者将为您搜索的元素添加一些新类,那么使用CSS选择器的import requests from bs4 import BeautifulSoup headers = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" } keywords = ["nike", "air"] base_url = "https://www.julian-fashion.com" for page in range(1, 11): print(f'[PAGE NR {page}]') url = "https://www.julian-fashion.com/en-US/men/shoes/sneakers?currPage={}".format(page) r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") all_links = soup.find_all("li", attrs={"class": "product in-stock"}) for link in all_links: if any(key in link.a["href"] for key in keywords): print("Product found.") print(base_url + link.a["href"]) print(link.img["title"]) print(link.div.div.ul.text) 仍然可以定位这些元素。我还使用urljoin创建了绝对链接,请参阅here why。

.select()

也许您希望关键字成为过滤项目的品牌,如果是,您可以使用下面的代码,而不是检查关键字是否在项目的链接中。

from bs4 import BeautifulSoup
import requests
from urllib.parse import urljoin

keywords = ["nike", "air"]
base_url = "https://www.julian-fashion.com"

for page in range(1, 11):
    print(f'[PAGE NR {page}]')
    url = "https://www.julian-fashion.com/en-US/men/shoes/sneakers?currPage={}".format(page)
    r = requests.get(url)
    soup = BeautifulSoup(r.text, "html.parser")
    all_items = soup.select('li.product.in-stock')

    for item in all_items:
        link = urljoin(base_url, item.a['href'])

        if any(key in link for key in keywords):
            title = item.img["title"]
            sizes = [size.text for size in item.select('.sizes > ul > li')]

            print(f'ITEM FOUND: {title}\n'
                  f'sizes available: {", ".join(sizes)}\n'
                  f'find out more here: {link}\n')

而不是:

    if item.select_one('.brand').text.lower() in keywords:

<强>监视器:

要制作一个简单的显示器来检查网站上的新项目,您可以使用下面的代码并根据您的需要进行调整:

    if any(key in link for key in keywords):

您可以通过创建包含多个from bs4 import BeautifulSoup import requests import time item_storage = dict() while True: print('scraping') html = requests.get('http://localhost:8000').text soup = BeautifulSoup(html, 'html.parser') for item in soup.select('li.product.in-stock'): item_id = item.a['href'] if item_id not in item_storage: item_storage[item_id] = item print(f'NEW ITEM ADDED: {item_id}') print('sleeping') time.sleep(5) # here you can adjust the frequency of checking for new items 的{​​{1}}文件在本地进行测试,您可以从网站上复制它们。 Enter Chrome DevTools,在index.html标签中找到一些<li class="product in-stock">。右键单击一个 - &gt;复制 - &gt;复制outerHTML,然后将其粘贴到li文件中。然后在控制台运行:Elements并运行上面的脚本。在执行期间,您可以添加更多项目并查看其index.html已打印。

示例输出:

python -m http.server 8000