运行结果:
详细情况:
我的代码:
from bs4 import BeautifulSoup
import requests, time
import pymongo
client = pymongo.MongoClient("localhost", 27017) # 访问mongoDB,创建数据库和表单
ceshi = client["ceshi"]
url_list = ceshi["url_list"]
item_info = ceshi["item_info"]
#spider1
def get_links_from(channel, pages,who_sells=0): #抓取列表页上商品的详情页链接
#http://bj.58.com/pbdn/0/pn2/
list_view = "{}{}/pn{}/".format(channel,str(who_sells), str(pages))
wb_data = requests.get(list_view)
time.sleep(1)
soup = BeautifulSoup(wb_data.text, 'lxml')
if soup.find("td", "t"):
for link in soup.select("tr.zzinfo td.t a.t"):
item_link = link.get("href").split("?")[0]
url_list.insert_one({"url" : item_link})
print(item_link)
else:
pass #到达列表页的最后的页面下一个页面
#spider2
def get_item_info(url): #抓取详情页商品的信息
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
title = soup.select("div.box_left_top > h1")[0].text
price = soup.select("span.price_now > i")[0].text
area = soup.select("div.palce_li > span > i")[0].text
item_info.insert_one({'title':title, 'price':price, 'area':area})
print({'title':title, 'price':price, 'area':area})
get_links_from("http://bj.58.com/pbdn/",2)
for item in url_list.find():
get_item_info(item["url"])
总结:
-1 调试代码时,记得注释掉创建数据库的代码。因为每次运行代码时,商品信息的字典可 能都不一样,所以它们都会被保存到数据库里,这造成了信息的重复。
-2 详情页商品信息的抓取和列表页商品详情页链接的抓取最好分开进行。因为一来可以提高代码的执行效率,二来当详情页商品信息的抓取失败时,修改后程序可以从这里开始,而不用再下载商品信息详情页的链接,而后再进行详情页商品信息的抓取