当前位置:   article > 正文

简单的爬取某租房网站租房信息并存入MySQL数据库_links_div = soup.find_all('div',class_="pic-panel"

links_div = soup.find_all('div',class_="pic-panel") links=[div.a.get('href')

这是我第一个爬虫项目,因为我有一些其他语言的基础,所以在入坑python十来天后终于完成了一个小项目,其间的辛酸不足为外人道也...说了这么多,那就让我们开始吧。

1.先看看使用的库:

  1. import requests
  2. import pymysql
  3. from bs4 import BeautifulSoup
  4. import datetime
  5. import re

requests库用于处理url,并将其转化为文本格式,用来分析;

BeautifulSoup库用于将处理的文本格式化为html的形式,可以方便的使用CSS来查找链接,寻找相似性,并且其中还用到过re库,使用正则表达式与前者的寻找链接速度做过比对,但是正则表达式直接分析文本不经BeautifulSoup转化虽然快,但是在使用的过程中发现会有很多重复;

datetime库用来计算程序运行时间;

pymysql用来对MySQL数据库进行操作,将爬取的数据全部存入数据库中,而且python3貌似不支持mysqldb;

2.函数(方法基本都写成了函数,避免代码重复)

下面代码中,使用beautifulSoup,由于html5lib的兼容性最好,所以我使用的是html5lib,也有其他的,如lxml,大家也可以尝试一下:

  1. # # 直接获取url的text形式,用正则表达式验证看是否能够加速
  2. # def get_text(page_url):
  3. # response = requests.get(page_url)
  4. # response.encoding = 'utf-8'
  5. # return response.text
  6. # 获取url下的页面内容,返回soup对象
  7. def get_htmtext(page_url):
  8. soup = BeautifulSoup(requests.get(page_url).text,'html5lib')
  9. return soup
  10. # 封装成函数,作用是获取列表页下面的所有租房页面链接,生成一个链接列表
  11. def get_links(page_url):
  12. soup = get_htmtext(page_url)
  13. links_div = soup.find_all('div',class_="pic-panel")
  14. links = [div.a.get('href') for div in links_div]
  15. return links

获取租房信息:

  1. # 获取房屋信息
  2. def get_info(link_url):
  3. soup = get_htmtext(link_url)
  4. price = soup.find('span',class_="total").text #价格
  5. unit = soup.find('span',class_="unit").text.strip() #单位,并去掉特殊符号
  6. house_info = soup.find_all('p') #获取租房信息
  7. area = house_info[0].text[3:]
  8. layout = house_info[1].text[5:]
  9. floor = house_info[2].text[3:]
  10. direction = house_info[3].text[5:]
  11. subway = house_info[4].text[3:]
  12. community = house_info[5].text[3:].strip()
  13. location = house_info[6].text[3:]
  14. create_time = house_info[7].text[3:]
  15. agent_name = soup.find('a',class_="name LOGCLICK").text
  16. house_num = soup.find('span',class_="houseNum").text[5:]
  17. # 生成字典
  18. info = {
  19. 'house_num': house_num,
  20. 'price': price,
  21. 'unit': unit,
  22. 'area': area,
  23. 'layout': layout,
  24. 'floor': floor,
  25. 'direction': direction,
  26. 'subway': subway,
  27. 'community': community,
  28. 'location': location,
  29. 'create_time': create_time,
  30. 'agent_name': agent_name
  31. }
  32. return info

设置登录数据库的参数以及登入函数:

  1. # 数据库登录参数设置
  2. DATABASE ={
  3. 'host': 'localhost', #如果是远程数据库,此处为远程服务器的IP地址
  4. 'database': 'test',
  5. 'user': 'root',
  6. 'password': '******'
  7. }
  8. # 登入数据库
  9. def load_db(setting):
  10. return pymysql.Connect(**setting)

将数据存入数据库的插入函数:

  1. # 插入数据库函数
  2. def insert_sql(db,house_info):
  3. dic = house_info
  4. ls = list(dic)
  5. table_name = 'user'
  6. data_type = {
  7. type("str"): '"%({})s"',
  8. type(0): '%({})s',
  9. type(0.1): '%({})s',
  10. type(None): 'null'
  11. }
  12. # sql生成语句
  13. sentence = 'insert ignore into %s('%table_name+','.join(ls)+') values(' + ','.join([data_type[type(dic[i])].format(i) for i in ls]) + ');'
  14. sql = sentence % dic
  15. cursor = db.cursor()
  16. try:
  17. cursor.execute(sql)
  18. db.commit()
  19. except Exception as e:
  20. print(e)

插入函数作为数据库存储的核心,其中的SQL生成语句是重中之重,可以一整行一整行的将数据存入,ignore避免重复存储,使用游标执行SQL语句,然后上传

最后进入正题,调用函数完成爬取,存储操作:

  1. # 根据规律获取所有页面链接
  2. def get_allpages():
  3. links = []
  4. for i in range(2,11):
  5. links.append('https://bj.lianjia.com/zufang/pg'+str(i)+'/')
  6. return links
  7. first_url = 'https://bj.lianjia.com/zufang/'
  8. start_time = datetime.datetime.now() # 程序开始时间
  9. # 使用BeautifulSoup方法,速度较慢但基本不会重复
  10. links = get_links(first_url)
  11. for i in get_allpages():
  12. for j in get_links(i):
  13. links.append(j)
  14. # # 使用正则表达式很快,但有许多重复
  15. # links = get_links(first_url)
  16. # for i in get_allpages():
  17. # eve_links = re.findall(r'href="(https://bj.lianjia.com/zufang/\w+\.html)"',get_text(i))
  18. # for j in eve_links:
  19. # links.append(j)
  20. db = load_db(DATABASE)
  21. for i in range(len(links)):
  22. insert_sql(db,get_info(links[i]))
  23. end_time = datetime.datetime.now() #程序结束时间
  24. print((end_time-start_time).seconds)

因为该网站每页的链接特别明显,所以直接写了一个get_allpages函数,大致思路就是从首页的一个url地址,不断地将其他页面的链接分析读取出来,所以很大一部分是找出链接的特征,而且在爬取时能明显的感觉速度很慢,300个链接大概需要五分钟,可能是方法的问题,而且只是单纯的入库,并没有进行数据分析,所以还有很多不足,下次应该会发一篇分析这批数据的文章,并且采用其他的方法爬取数据。人生苦短,我用python!感谢大家的阅读!

 

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号