实现逻辑
链家爬取是一个简单的爬虫逻辑
获取页面----->解析页面--------->数据的永久保存
现在我们直接上代码
上代码
#一个非常常用的爬虫库
#模拟浏览器,向服务器获取页面
import requests
#解析库
from lxml import html
import csv
import time
#新版lxml就是有点麻烦,之前直接可以调用etree方法
etree = html.etree
#获取页面
def getPage(url,header):
# 请求页面
res = requests.get(url,headers=header)
# 使用utf-8编码
res.encoding='utf-8'
# 获取页面
html = res.text
# 如果是非结构化数据,就用这content属性
# p = res.content
# 请求请求状态码,请求成功就是200,请求失败是404
print(res.status_code)
return html
#解析页面
def parsPage(html):
parsHTML = etree.HTML(html)
# 提取出来的xpath内容列表
rl = parsHTML.xpath(r'//div[@class="resblock-list-container clearfix"]/ul[@class="resblock-list-wrapper"]/li[@class="resblock-list post_ulog_exposure_scroll has-results"]')
# 遍历rl,
for i in rl:
# 小区名
name = i.xpath('./a/@title')[0]
# 小区地址
addr = i.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-location"]/a/text()')[0]
# 小区单位房价
price = i.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-price"]/div[@class="main-price"]/span[@class="number"]/text()')[0]
# print是在屏幕显示price这一变量的值
print(price)
# 把三个值放入l的元组里面,元组是一个数据类型
l = (name,addr,price)
# 调用函数
saveData(l)
#数据的保存
def saveData(l):
# csv就是我们常用的exel格式
with open ('GZL.csv','a',newline='') as f:
c = csv.writer(f)
print(l)
try:
c.writerow(l)
except:
print('存在异常',l)
#主函数
def main():
# 请求头
header ={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
# 基础连接地址
baseurl = 'https://gz.fang.lianjia.com/loupan/nhs1/'
# 页数
page = int(input('请输入爬取的页数'))
# if就是如果
if page == 1:
html = getPage(baseurl,header)
parsPage(html)
if page > 1:
html = getPage(baseurl,header)
parsPage(html)
for i in range(2,page+1):
url = baseurl + 'pg%d'%i
html = getPage(url,header)
parsPage(html)
main()