import requests #用于向网站服务器发起请求
from bs4 import BeautifulSoup #用于处理服务反馈回来的网页文件
import pymongo #用于连接MongoDB数据库
# 连接MongoDB数据库
client = pymongo.MongoClient('localhost',27017)
xiaozhu = client['xiaozhu'] #创建数据库
bnb_info = xiaozhu['bnb_info']#创建数据表
# ====================================================== <<<< 单页行为 >>>> =============================================
url = 'http://bj.xiaozhu.com/search-duanzufang-p20-0/'
wb_data = requests.get(url) #发起请求
soup = BeautifulSoup(wb_data.text,'lxml') #以lxml方式解析文本
titles = soup.select('span.result_title') #筛选标题
prices = soup.select('span.result_price > i') #筛选价格
#for title, price in zip(titles,prices): #zip()将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不同,返回列表长度与最短的迭代器相同。
data = {
'title':title.get_text(),
'price':int(price.get_text())
}
bnb_info.insert_one(data) #将爬取的信息插入到数据表中
print('Done')
# ====================================================== <<<< 设计函数 >>>> =============================================
#爬取多页面信息
def get_page_within(pages):
for page_num in range(1,pages+1):
wb_data = requests.get('http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(page_num))
soup = BeautifulSoup(wb_data.text,'lxml')
titles = soup.select('span.result_title')
prices = soup.select('span.result_price > i')
for title, price in zip(titles,prices):
data = {
'title':title.get_text(),
'price':int(price.get_text())
}
bnb_info.insert_one(data)
print('Done')
get_page_within(3) #获取前三页面得数据
# 从数据库中进行筛选
for i in bnb_info.find():
if i['price'] >= 500:
print(i)
爬取步骤:
1、引入相应的库,这些库具备连接数据库以及对网站发起请求的功能。
2、设计爬取商品详情页的爬虫,定位相关标签,获取标签信息,将筛选出的信息插入到数据库中。(其实就这么简单)
3、我们已经知道了怎么样爬取单个页面的信息,接下来就是爬取多个页面的信息。这些页面的链接通常存在一定的规律,找到这个规律即可。
(爬取多次后可能会出现无法爬取的问题,这是网站的反爬虫机制起作用了)