我有一个代码,可以使用特定关键字抓取所有产品的链接,标题和尺寸。在完成第一次刮擦之后,如果添加了新项目,我希望一次又一次地检查脚本。我试试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)
答案 0 :(得分:0)
你在currPage之前缺少?
,它应该是这样的:https://www.julian-fashion.com/en-US/men/shoes/sneakers?currPage={}
。?
表示query string的开头。现在你的代码可以运行了。
您还可以省略页面0
,因为此网站从1
开始分页,并提供0
给404 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