python_58ershou
python+beautifulsoup多线程爬取58同城二手全部商品信息,并在jupyter上将数据可视化
项目主程序在58_index中:
建立mango数据库表
#连接MongoDB数据库
client=pymongo.MongoClient('localhost',27017)
#建立learn数据库,如果没有会自动创建
learn=client['samecity58']
#创建数据表
url_list=learn['url_list1']
shop_list=learn['shop_list']
主函数:
if __name__=='__main__':
channal_links = channal_get('http://bj.58.com/sale.shtml')
# get_links_from(channal_links[0],1)
# things_get('http://zhuanzhuan.58.com/detail/957912684012519433z.shtml')
pool=Pool()
pool.map(get_all_links_from ,channal_links)
pool.close()
pool.join()
Pool 可以提供指定数量的进程供用户使用,默认是 CPU 核数。当有新的请求提交到 Poll 的时候,如果池子没有满,会创建一个进程来执行,否则就会让该请求等待。
- Pool 对象调用 join 方法会等待所有的子进程执行完毕
- 调用 join 方法之前,必须调用 close
- 调用 close 之后就不能继续添加新的 Process 了
其中,使用map方法将列表channal_links(见下代码)传入get_all_links_from函数
channal_get (返回一个列表)
#获取分类链接列表
def channal_get(url):
try:
url_part='http://bj.58.com'
channal_links=[]
wb_data=requests.get(url)
soup=BeautifulSoup(wb_data.text,'lxml')
links=soup.select('ul.ym-submnu > li > b > a')
except RequestException:
print('获取分类链接失败')
for link in links:
channal_link=url_part+link.get('href')
channal_links.append(channal_link)
print('成功获取分类链接')
return channal_links
get_all_links_from爬取多页商品url
def get_all_links_from(channel):
for i in range(1,101):
get_links_from(channel,i)
get_links_from
#获取分类中的商品的url,who_sell=0代表个人,1是商家
def get_links_from(channel,page,who_sell=0):
#'http://bj.58.com/shouji/0/pn1/'
try:
url=channel+str(who_sell)+'/pn'+str(page)
wb_data=requests.get(url)
time.sleep(1)
soup=BeautifulSoup(wb_data.text,'lxml')
except RequestException:
print("获取商品链接失败")
#判断当前页码有没有有效信息
if soup.find('td','t'):
links=soup.select('td.t > a')
for link in links:
items_link=link.get('href').split('?')[0]
#二手手机个人页面前几个是个人回收,而且链接是一个跳转首页链接,给排除掉
if items_link.split('/')[-1] == 'jump':
pass
else:
url_list.insert_one({'url': items_link})
else:
pass
url_list.insert_one({‘url’: items_link}):将想要的商品链接存入Mongo数据库的url_list表
things_get
#获取商品信息
def things_get(url):
print('开始采集商品信息')
wb_data=requests.get(url)
time.sleep(2)
soup=BeautifulSoup(wb_data.text,'lxml')
try:
titles=soup.select('.box_left_top > h1')[0].text
price=soup.select('.price_now > i')[0].text
place=soup.select('.palce_li > span > i ')[0].text
scan=soup.select('p.info_p > .look_time')[0].text
want=soup.select('p.info_p > .want_person')[0].text
except Exception:
print(url)
if price=='0':
print('商品已经下架')
else:
shop_list.insert_one({'title':titles,'price':price,'area':place,scan:want})
shop_list.insert_one({‘title’:titles,’price’:price,’area’:place,scan:want}):将商品信息存入Mongo数据库shop_list表
count_DB
count_DB 是个计数程序,实时监视shop_list表,查看数据库中已经存入了多少商品信息
import time
from Tao_mm import shop_list
while True:
print(shop_list.find().count())
time.sleep(5)