爬虫(成都58同城所有房价,Python实现)
Python实现爬虫(爬取58同城所有房价)
程序发布日期2018-9-25(如果以后不能使用了,就需要更改解析方式.)
github博客传送门
csdn博客传送门
爬虫文件(Python实现)-爬取的数据文件(txt文件,空格分隔)-分析的文件(Python实现)-简单的分析结果图(png图4张) 资源链接地址:https://download.csdn.net/download/zhanghao3389/10686953
本章所需知识:
- 熟悉urllib.request模块(本次使用的是Python3,Python2请使用urllib和request两个模块)
- urllib.request.urlopen() # 打开一个http请求
- read() # 返回的信息中的.read()方法
- 熟悉lxml中的etree模块
- etree.HTML() # 将html转换成能解析的格式
- xpath的使用
- 由于我还没写xpath笔记所以参照菜鸟教程:http://www.runoob.com/xpath/xpath-syntax.html
- 文件操作
- 点到为止,打开一个文件 写入 关闭即可. 参考:https://blog.csdn.net/zhanghao3389/article/details/82386935
- 函数
- 时间模块
- 暂停的一个方法即可 time.sleep() 参照:https://blog.csdn.net/zhanghao3389/article/details/82589809
分析页面链接(pandas+numpy+matplotlib):https://blog.csdn.net/zhanghao3389/article/details/82845263
接下来上代码:
import urllib.request # 打开网页,读取网页内容用
from lxml import etree # 解析网页用
import time # 这里只使用了暂停程序的作用
url = 'https://cd.58.com/ershoufang/pn{}' # 需要解析的网页
# 定义了一个获取网页的方法 (http请求)
def getHtml(url):
response = urllib.request.urlopen(url) # 打开获取的链接
print(response.getcode()) # 返回一个网页打开的状态码
html = response.read() # 将获取的网页写入html
return html # 返回给调用者
# 定义了一个解析网页的方法 (解析器)
def parserHtml(html): # 将一个下载好的html传入解析器
html_text = etree.HTML(html) # 将html转换成xpath可以解析的格式
message_list = html_text.xpath('/html/body/div[5]/div[5]/div[1]/ul/li') # 解析到每个li元素的位置
for message in message_list: # 遍历所有的li元素
region = message.xpath('./div[2]/p[2]/span/a[2]/text()') # 解析地理位置
price = message.xpath('./div[3]/p[1]/b/text()') # 解析房子的价格
company = message.xpath('./div[3]/p[1]/text()') # 解析房子的价格单位
area = message.xpath('./div[2]/p[1]/span[2]/text()') # 解析房子的面积
unit_price = message.xpath('./div[3]/p[2]/text()') # 解析房子的单价
area = area[0].strip() # 将房子的面积后的空格去掉(房子的面积参数后面有个 html的空格 跟我们写入的格式不一样所以必须去掉才能写入到本地)
b = '{0} {1} {2} {3}' # 占位符(将每个数据中间添加一个空格隔开,便于后续导入excel)
a = b.format(region[0], price[0] + company[0], area, unit_price[0]) # 将爬取的数据格式化
print(a) # 打印出格式化后的数据
with open('message.txt', 'a') as f: # 打开一个文件存入格式化后的文件
f.write(str(a)) # 将数据写入文件
f.write('\n') # 写入一个换行符
# 主函数
for i in range(1, 70): # 遍历69次(看了一下网站 大概只有70页 为了不增加程序难度 手动翻69次)
print('第{}页'.format(i)) # 打印正在爬取第几页
url1 = url.format(i) # 将url格式化 传入页数
html = getHtml(url1) # 下载html (将格式化好的url1传入 getHtml 方法中)
parserHtml(html) # 解析html (将下载好的 html 传入 parserHtml 方法中解析)
time.sleep(1) # 暂停一秒 (有时候有检测会封 ip 然后将暂停时间调大一点 手动进入浏览器将验证码输入一遍就可以重新爬取了.
分析页面链接(pandas+numpy+matplotlib):https://blog.csdn.net/zhanghao3389/article/details/82845263
程序运行状态图: