我目前正在开发一个webcrawler。我希望我的代码从我抓取的所有网址中获取文本。函数getLinks()找到我想从中获取数据的链接并将它们放入数组中。该阵列目前有12个链接,如下所示: 'http://www.computerstore.nl/product/142504/category-100852/wd-green-wd30ezrx-3-tb.html'
这是我的函数的代码,它使用我从getLinks()
获取的url遍历我的数组,并从中获取数据。所以我遇到的问题是它有时会返回文本6次,有时是8或10.但不是应该的12次。
def getSpecs():
i = 0
while (i < len(clinks)):
r = (requests.get(clinks[i]))
s = (BeautifulSoup(r.content))
for item in s.find_all("div", {"class" :"productSpecs roundedcorners"}):
print item.find('h3')
i = i + 1
getLinks()
getSpecs()
我该如何解决这个问题?请帮忙。
提前致谢!
答案 0 :(得分:2)
以下是具有多个修复程序的改进代码:
requests.Session
urparse.urljoin()
加入网址CSS selectors
代替find_all()
代码:
from urlparse import urljoin
from bs4 import BeautifulSoup
import requests
base_url = 'http://www.computerstore.nl'
curl = ["http://www.computerstore.nl/category/100852/interne-harde-schijven.html?6437=19598"]
session = requests.Session()
for url in curl:
soup = BeautifulSoup(session.get(url).content)
links = [urljoin(base_url, item['href']) for item in soup.select("div.product-list a.product-list-item--image-link")]
for link in links:
soup = BeautifulSoup(session.get(link).content)
print soup.find('span', itemprop='name').get_text(strip=True)
它抓取每个产品链接,跟随它并打印出产品标题(12个产品):
WD Red WD20EFRX 2 TB
WD Red WD40EFRX 4 TB
WD Red WD30EFRX 3 TB
Seagate Barracuda ST1000DM003 1 TB
WD Red WD10EFRX 1 TB
Seagate Barracuda ST2000DM001 2 TB
Seagate Barracuda ST3000DM001 3 TB
WD Green WD20EZRX 2 TB
WD Red WD60EFRX 6 TB
WD Green WD40EZRX 4 TB
Seagate NAS HDD ST3000VN000 3 TB
WD Green WD30EZRX 3 TB