IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 山东大学软件工程应用与实践——ECommerceCrawlers代码分析(十一) -> 正文阅读

[Python知识库]山东大学软件工程应用与实践——ECommerceCrawlers代码分析(十一)

2021SC@SDUSC


目录

一、摘要

二、get_parks.py文件代码分析

1.部分一?

2.部分二

三、总结?


一、摘要

本篇博客是第三个项目“QiChaCha”的第二篇博客,本篇博客主要是对该项目的核心文件的代码部分进行分析,首先分析的是“get_parks.py(获取园区信息)”文件的代码。

二、get_parks.py文件代码分析

1.部分一?

def get_parks(num_page):
    url = "https://www.qichacha.com/more_zonesearch.html?searchKey=&p={}".format(
        num_page)
    ua = UserAgent(verify_ssl=False)
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Cookie': cookie,
        'DNT': '1',
        'Host': 'www.qichacha.com',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': ua.random
    }
    response = requests.get(url, headers=headers)
    html = response.text
    parseHtml = etree.HTML(html)
    rUrls = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/@href')
    rTitle = parseHtml.xpath(
        '//div[@class="panel n-s m-t-md"]/a/div[@class="ea_title"]/text()')
    rProvince = parseHtml.xpath(
        '//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][1]/span[1]/text()')
    rCityCounty = parseHtml.xpath(
        '//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][1]/span[2]/text()')
    rArea = parseHtml.xpath(
        '//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][2]/span[1]/text()')
    rNumCop = parseHtml.xpath(
        '//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][2]/span[2]/text()')

开头先定义url,后面的数字代表不同的页数,然后自定义headers以便能正常的爬取网页。

response = requests.get(url, headers=headers)
html = response.text
parseHtml = etree.HTML(html)

获取到url对应的网页内容,并提取出response的text格式赋给html,再将html赋成etree对象。

rUrls = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/@href')

接下来都是用xpath来对parseHtml内容进行数据提取。rUrls提取的是某工业园区的url。例:

# '/zonecompany_02212bebbb2c3b0212c7652e6feaeacf'

在这里,.xpath后面跟着的是xpath的路径表达式和谓语。

Xpath使用路径表达式在XML文档中选取节点。节点是通过沿着路径来选取的,通过路径可以找到我们想要的节点或者节点范围。

谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中。

?rTitle = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/div[@class="ea_title"]/text()')

该表达式是求的工业园区的名称(rTitle)(例:'\n 银江科技产业园\n )?

rProvince = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][1]/span[1]/text()')

该表达式是求的该工业园区所在省份(rProvince)(例:'省份:浙江省')

CityCounty = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][1]/span[2]/text()')

该表达式求的是工业园区所在的城市/区(CityCountry)(例:'城市/区:杭州市, 西湖区')

?rArea = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][2]/span[1]/text()')

该表达式求的是工业园区的占地面积(rArea)(例:'占地面积:9亩')?

rNumCop = parseHtml.xpath('//div[@class="panel n-s m-t-md"]/a/div[@class="clearfix"][2]/span[2]/text()')

该表达式求的是工业园区的企业数量(rNumCop)(例:'企业数:278家')

2.部分二

path = './csv/'
    if not os.path.exists(path):
        os.makedirs(path)
        print(path, ' 文件夹创建成功')
    file_name = path+parks_name+'.csv'
    if not os.path.exists(file_name):
        header = ['province', 'city', 'county',
                  'park', 'area', 'numcop', 'url']
        with open(file_name, 'a', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow(header)
    num = len(rUrls)
    for i in range(num):
        url = 'https://www.qichacha.com' + rUrls[i]
        park = rTitle[i].replace('\n', '').strip()
        province = rProvince[i].replace('省份:', '')
        city = rCityCounty[i].replace('城市/区:', '').split(', ')[0]
        county = rCityCounty[i].replace('城市/区:', '').split(', ')[-1]
        area = int(rArea[i].replace('占地面积:', '').replace('亩', ''))
        numcop = int(rNumCop[i].replace('企业数:', '').replace('家', ''))
        L = [province, city, county, park, area, numcop, url]
        with open(file_name, 'a', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerow(L)

path?=?'./csv/'
????if?not?os.path.exists(path):
????????os.makedirs(path)
????????print(path,?'?文件夹创建成功')
????file_name?=?path+parks_name+'.csv'

如果path不存在,则新建一个文件夹,文件名称为path+parks_name+'.csv'。

????if?not?os.path.exists(file_name):
????????header?=?['province',?'city',?'county',
??????????????????'park',?'area',?'numcop',?'url']
????????with?open(file_name,?'a',?newline='',?encoding='utf-8')?as?f:
????????????writer?=?csv.writer(f)
????????????writer.writerow(header)

如果文件名不存在,则定义一个文件头(header),文件头包含文件的各种相关信息,然后创建该CSV文件。

?num?=?len(rUrls)
????for?i?in?range(num):
????????url?=?'https://www.qichacha.com'?+?rUrls[i]
????????park?=?rTitle[i].replace('\n',?'').strip()
????????province?=?rProvince[i].replace('省份:',?'')
????????city?=?rCityCounty[i].replace('城市/区:',?'').split(',?')[0]
????????county?=?rCityCounty[i].replace('城市/区:',?'').split(',?')[-1]
????????area?=?int(rArea[i].replace('占地面积:',?'').replace('亩',?''))
????????numcop?=?int(rNumCop[i].replace('企业数:',?'').replace('家',?''))
????????L?=?[province,?city,?county,?park,?area,?numcop,?url]
????????with?open(file_name,?'a',?newline='',?encoding='utf-8')?as?f:
????????????writer?=?csv.writer(f)
????????????writer.writerow(L)?

对于之前获取到的rUrls列表,求出长度并对其遍历,在for循环中,每次将一个拼接好的url保存为url,将之前获取到的rTitle,rProvince等值赋给park,province等变量。最后将这些已经存好值的变量存为一个对象L,将该对象L(一个工业园区的基本信息)写入创建好的文件里。

文件内容实例:

三、总结?

至此,get_parks.py(获取园区信息)文件的核心代码已分析完毕,我将在下一篇博客里对本项目剩余的核心代码进行分析。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:53:53  更:2021-12-14 15:55:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:43:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码