鱼C论坛

 找回密码
 立即注册
查看: 3079|回复: 2

爬取的数据怎么保存到数据库

[复制链接]
发表于 2021-3-26 22:53:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# -*- coding : utf-8 -*-
# -*- author : caoyin -*-
import requests #用来访问网页的库,好比浏览器
from bs4 import BeautifulSoup #爬虫库,用来抓取网页中的信息
import time #时间模块,为了控制爬虫速度,防止由于速度过快,被 ban IP
import csv #用来操作csv的库,这次用来创建表格,存储数据
import urllib.request #用来设置代理Ip
import random #随机选用IP和代码运行时间
import os #创建文件夹,保存信息
def save_to_mysql(post_data):
    print("saving......")

    db = pymysql.connect("127.0.0.1", "root", "root", "test")
    cursor = db.cursor()
    effect_row = cursor.executemany("insert into houselist(aeraname , housetype, area, p1, p2, region) values (%s, %s, %s, %s, %s, %s)", post_data)
    print(effect_row)
    db.commit()  # 提交事务
    cursor.close()
    db.close()

def get_url(pages): #建立获取网址的函数,参数为所需要提取的一级网址起始和终止页码
    #设置代理
    iplist =['23.244.28.27:3128', '65.49.222.187:8080', '167.99.236.14:80']
    proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)

    url_list = [] #建立一个空列表,用于存放二级网址
    headers = {'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} #http请求头,用于模拟用户访问网页,防止被 ban IP
    url_page = ['https://nj.lianjia.com/ershoufang/pg{}/'.format(num) for num in range(pages)] #列表解析式,创建列表,存放一级网址
    n = 0 #设定一个计数变量
    for page in url_page: #遍历每个一级网址
        n+=1 #计数加1
        print('正在抓取第{}页链接'.format(n)) #输出正在抓取的是第几个链接
        time.sleep(random.randint(2,4)) #代码随机暂停运行2-4秒,控制爬虫速度,防止被 ban IP
        page_data = requests.get(page,headers=headers) #用requests库的get方法访问一级网址,参数为链接和请求头
        soup = BeautifulSoup(page_data.text,'lxml')  #创建一个实例化BeautifulSoup类,类为一级网址的页面,用lxml库解析处理
        urls = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.title > a')#用selector选择器根据html标签,在页面中定位二级链接位置,最后返回的是一个列表
        for i in urls: #遍历此列表,提取每一个位置
            url_list.append(i.get('href')) #提取位置中链接的信息并存入开始创建的空列表中
    return url_list #函数返回二级网址列表

def download_inf(folder,url_list): #创建爬虫函数
#这里要先创建一个CSV文件,用于存放爬取的数据
    try:
        os.mkdir(folder)
    except OSError:
        pass
    os.chdir(folder)
    file = open('lianjia.csv','a+',encoding='utf-8-sig') #创建并打开csv文件,参数为文件路径,打开方式ab+: 二进制附加读写方式打开,utf-8-sig编码
    writer = csv.writer(file) #对csv进行写入
    writer.writerow(['标题','小区名称','总价(万元)','单价(元/平米)','建筑面积(平米)','所在区域','户型','所在楼层','房屋朝向','装修情况']) #写入表头

    inf_all = [] #新建一个空列表,存放每一条爬取的数据,用于方便写入文件
    headers={'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} #同样先定义一个http请求头
    n = 0 #设定一个计数变量
    for url in url_list: #遍历每个二级网址emus
        n+=1 #计数加1
        print('正在抓取第{}个房源'.format(n)) #输出正在抓取的是第几个房源信息
        time.sleep(random.randint(2,4)) #代码暂停运行2-4秒,为了控制爬虫速度,防止被 ban IP
        web = requests.get(url,headers=headers) #用requests库的get方法访问二级网址,参数为链接和请求头
        soup = BeautifulSoup(web.text,'lxml') #创建一个实例化BeautifulSoup类,类为二级网址的页面,用lxml库解析处理
        titlel = soup.select('body > div.sellDetailHeader > div > div > div.title > h1')#selector选择器获取房源标题
        namel = soup.select('body > div.overview > div.content > div.aroundInfo > div.communityName > a.info') #selector选择器获取小区名称
        pricel = soup.select('body > div.overview > div.content > div.price > span.total') #selector选择器获取总价
        area_pricel = soup.select('body > div.overview > div.content > div.price > div.text > div.unitPrice > span') #selector选择器获取每平米价格
        areal = soup.select('body > div.overview > div.content > div.houseInfo > div.area > div.mainInfo') #获取面积
        positionl = soup.select('body > div.overview > div.content > div.aroundInfo > div.areaName > span.info > a:nth-child(1)') #获取位置信息
        room_typel = soup.select('body > div.overview > div.content > div.houseInfo > div.room > div.mainInfo') #获取户型信息
        floorl = soup.select('#introduction > div > div > div.base > div.content > ul > li:nth-child(2)') #获取楼层信息
        house_orientationl = soup.select('#introduction > div > div > div.base > div.content > ul > li:nth-child(7)') #获取房屋朝向信息
        renovation_conditionl = soup.select('#introduction > div > div > div.base > div.content > ul > li:nth-child(9)') #获取房屋装修情况信息
        for title,name,price,area_price,area,position,room_type,floor,house_orientation,renovation_condition in zip(titlel,namel,pricel,
        area_pricel,areal,positionl,room_typel,floorl,house_orientationl,renovation_conditionl): #遍历获取的每一个信息,提取具体的值
            data_list = [title.get_text(),name.get_text(),price.get_text(),area_price.get_text(),area.get_text(),position.get_text(),
            room_type.get_text(),floor.get_text(),house_orientation.get_text(),renovation_condition.get_text()] #把值以列表形式存入一个变量
            inf_all.append(data_list)
            file = open('./lianjia.csv','a+',encoding='utf-8-sig',newline='') #打开csv文件
            writer = csv.writer(file) #对csv进行写入
            for row in inf_all:
                writer.writerow(row) #写入爬取的数据
            inf_all = [] #清空列表,待存放下一个数据
def main():   #创建一个主函数,汇总以上两个函数
    url_list = get_url(pages)
    download_inf(folder,url_list)

if __name__ == '__main__': #相当于程序入口,当该文件被直接执行时,该语句后面的代码执行,但该文件作为模块被引用时,后面的代码不被执行
    folder = input('请输入保存文件夹:')
    pages = int(input('请输入要爬取的页面数量:'))
    main() #运行函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-27 07:10:28 From FishC Mobile | 显示全部楼层
你想问什么呢?这是一个我不清楚是否能正确执行的代码,也添加了很多不知道是否真确的注释
更是不知道你想表达什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-27 17:11:24 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-26 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表