爬虫案例一:拍拍网
前言
本文主要是通过学习的知识,写了一个简单的小爬虫,获取了拍拍网的产品信息,并存贮在mongodb中。
一. 拍拍网案例
这里主要是爬取了拍拍网(京东旗下的一个二手市场)的部分商品(商品的内容可以自己指定)。然后用多线程爬取你输入的商品,并将这些内容导入到mongodb中。
1.1 首先将需要的包导入
import pymongo
import requests
from bs4 import BeautifulSoup
import time
from multiprocessing import Pool
1.2 创建一个爬取拍拍网的类
class paipai_spider():
# 创建数据库以及相应的表格
client = pymongo.MongoClient('localhost', 27017)
paipai = client['paipai']
ershoushouji = paipai['ershoushouji']
def get_soup(self, url):
headers = {
"User-Agent": "*****",
"Cookie": "*****",
"Referer": "******"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")
return soup
# 通过调用get_soup函数,获得我们需要的数据
def get_data(self, url):
soup = self.get_soup(url)
# 这是获取的一页的数据
urls = [i.get("href") for i in soup.select("#J_goodsList > ul > li > div > div.p-img > a")] # 链接
titles = [i.get("title") for i in soup.select("#J_goodsList > ul > li > div > div.p-img > a")] # 标题
images = [i.get("data-lazy-img") for i in
soup.select("#J_goodsList > ul > li > div > div.p-img > a > img")] # 图片
prices = [i.text for i in soup.select("#J_goodsList > ul > li > div > div.p-price > strong > i")] # 价格
infos = [i.text.split("\n")[-1] for i in
soup.select("#J_goodsList > ul > li > div > div.p-name.p-name-type-2 > a > em")] # 信息
comments = [i.get("href") for i in
soup.select("#J_goodsList > ul > li > div > div.p-commit > strong > a")] # 评论
shop_names = [i.get("title") for i in soup.select("#J_goodsList > ul > li > div > div.p-shop > span > a")] # 店名
discounts = [[i.text for i in i.select("i")] for i in
soup.select("#J_goodsList > ul > li > div > div.p-icons")] # 优惠
time.sleep(2) # 以防爬取的太密集被反爬虫,这里休息两秒。
# 将这些数据存贮成字典形式
for url, title, image, price, info, comment, shop_name, discount in zip(urls, titles, images, prices, infos,
comments, shop_names, discounts):
data = {
"urls": url,
"titles": title,
"images": image,
"prices": price,
"infos": info,
"comments": comment,
"shop_names": shop_name,
"discounts": discount
}
self.ershoushouji.insert_one(data)
print("Insert OK!") # 爬完一页之后,显示一下。
"""
主要是我们得进入该链接,然后看这个网页最大是多少页,然后将page进行设定,就可以获取所有该种二手产品的网页,
当然了,首先第一步是输入该种产品的链接,最后返回该种产品的所有链接的一个列表。
但是,好像网页不显示这个页码,也就是找不出来,很奇怪。。
而且,本来只有100页的内容,也就是page=199就结束了,但是我发现,page=201同样也有内容。。
所以,我就降低要求吧,比如每种二手产品,我们只爬取100页就好。
"""
# 如何获取某一种产品的所有链接
def get_type_urls(self, url):
# 这里可以设定爬取多少页的内容
return [url + "&page={}".format(i) for i in range(1, 201)]
# 获得你想要的产品的链接
def get_all_types(self, name):
"""
param:
name:输入想要看的产品名称 ,输入类型为 字符串
return:输出所有该类产品的所有链接,输出类型为字符串
"""
return "https://search.jd.com/Search?keyword={}".format(name)
1.3 实现爬虫类并做测试。
if __name__ == "__main__":
pool = Pool() # 使用多线程
paipai = paipai_spider()
# product = ["二手手机", "电脑", "家电", "图书", "乐器", "奢侈品"]
name = paipai.get_all_types("二手手机") # 首先,先输入你想爬取的内容的种类
urls = paipai.get_type_urls(name) # 通过“name”,获取了关于“name”的所有链接
# 在“urls”链接中,我逐个输入,就可以得到每条数据
pool.map(paipai.get_data, (url for url in urls))
print("Spider finish!")
总结
代码刚出炉的,在短时间内使用应该是没问题的。也算是对前面学习的爬虫知识的一个检验,其实也有很多需要修改和优化的地方,也恳请大家集思广益,谢谢大家。
溜了遛了,脑壳疼。Loading(26/100)。。。