01-岗位数据爬虫

import requests
from re import findall
from json import loadsheaders = {'cookie': '_uab_collina=166373032503108913870333; guid=f07d710a6c75cd3514a5280294353a54; nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; search=jobarea%7E%60090200%7C%21ord_field%7E%600%7C%21recentSearch0%7E%60090200%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FA%CA%FD%BE%DD%B7%D6%CE%F6%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch1%7E%60090200%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FAhr%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch2%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FAhr%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch3%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FA%CA%FD%BE%DD%B7%D6%CE%F6%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21; slife=lowbrowser%3Dnot%26%7C%26; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22f07d710a6c75cd3514a5280294353a54%22%2C%22first_id%22%3A%221835e0e15461639-0a46ef7ec55af38-1a525635-1296000-1835e0e15471a98%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgzNWUwZTE1NDYxNjM5LTBhNDZlZjdlYzU1YWYzOC0xYTUyNTYzNS0xMjk2MDAwLTE4MzVlMGUxNTQ3MWE5OCIsIiRpZGVudGl0eV9sb2dpbl9pZCI6ImYwN2Q3MTBhNmM3NWNkMzUxNGE1MjgwMjk0MzUzYTU0In0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22f07d710a6c75cd3514a5280294353a54%22%7D%2C%22%24device_id%22%3A%221835e0e15461639-0a46ef7ec55af38-1a525635-1296000-1835e0e15471a98%22%7D; privacy=1666315707; partner=51jobhtml5; acw_tc=ac11000116663157236133228e00e1446dda57d4b6ce3992bd018af60342f0; acw_sc__v2=6351f5cb9bec157b8349acb257adf72ca035506c; acw_sc__v3=6351f694c99a8e4e83cf324d4f4f1cfc197bc956; ssxmod_itna=YqUxBDuDgD973eBPGKiQ23TwfG8WYq1eD0e=QGx0vHeGzDAxn40iDtPoNO7ti3bRDxa1YhDumomWEGnR3TKGGara+W2BWeD=xYQDwxYoDUxGtDpxG6YK+DYYkDt4DTD34DYDi2=DBBv/QD7gU//MjM9f+xxBo/tkQSUk4DCE4DbrpBDB==xBQDXwjXIWX4xnRYi7oawAv9SGPtzioe77+YYGGtjpmmtRqPf0D=WAwkX0mmxDfxiKqxD=; ssxmod_itna2=YqUxBDuDgD973eBPGKiQ23TwfG8WYq1eD0e=QDnF8KqDs1YeDL7ibtyS4nbcicjoBK70i5HBKSfRmOM/PCo6vDaBRGTjKmSj++OFLQpgQ4UI9xlRx12OU401nj/azOmuKb4x/1YUwwscnysFPBsXgnskPH8hgeqq97=ED07mB4DLxG7mYD==','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}url = 'https://search.51job.com/list/090200,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
response = requests.get(url, headers=headers)# print(response.text)

1.从请求结果中提取json数据

result = findall(r'window.__SEARCH_RESULT__ = (.+?)</script>', response.text)
if result:json_data = result[0]# print(json_data)else:print('获取数据失败')raise ValueError

2.做json解析

data = loads(json_data)
for x in data['engine_jds']:name = x['job_name']company = x['company_name']companytype = x['companytype_text']providesalary = x['providesalary_text']print(name, providesalary, company, companytype)

02-爬京东评论数据

import requests
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome,ChromeOptions
from time import sleep# https://search.jd.com/Search?keyword=电脑&wq=电脑&pvid=f7face95232a45289adad6b223e458bd&page=1# https://search.jd.com/Search?keyword=电脑&wq=电脑&pvid=f7face95232a45289adad6b223e458bd&page=2# https://search.jd.com/Search?keyword=电脑&wq=电脑&pvid=f7face95232a45289adad6b223e458bd&page=3def get_one_page_data(page, goods='电脑'):

1.请求指定商品指定页的数据

 url = f'https://search.jd.com/Search?keyword={goods}&wq={goods}&pvid=f7face95232a45289adad6b223e458bd&page={page}'headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}response = requests.get(url, headers=headers)

2.解析数据,获取每个商品的详情页地址

    soup = BeautifulSoup(response.text, 'lxml')all_a = soup.select('#J_goodsList>ul>li .p-img>a')all_url = ['https:'+x.attrs['href'] for x in all_a]

3. 获取每个商品的详情数据

 for x in all_url:get_one_goods_info(x)def get_one_goods_info(url):

打开页面

    b.get(url)

滚动

  b.execute_script('window.scrollBy(0, 500)')sleep(1)b.execute_script('window.scrollBy(0, 500)')sleep(1)

找到商品评价按钮并且点击

    all_li = b.find_elements_by_css_selector('#detail>div>ul>li')for x in all_li:if x.text.startswith('商品评价'):x.click()breakelse:print('该商品无评价信息!')return

解析数据

    sleep(1)
​    soup = BeautifulSoup(b.page_source, 'lxml')
​    all_li = soup.select('.parameter2>li')
​    name = all_li[0].text.split(':')[-1]
​    good_comment = soup.select_one('.filter-list>li:nth-child(5)>a').text
​    print(name, good_comment)if __name__ == '__main__':options = ChromeOptions()options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})b = Chrome(options=options)​    get_one_page_data(1)

03-认识xpath和xml数据

lxml是Python基于xpath做数据解析的工具

from lxml import etree

1.xpath数据解析 -

通过提供标签路径来获取标签(xpath指的就是标签的路径)

1)xpath基本感念

树: 整个html内容或者整个xml内容
节点:树结构中的每个标签(元素)就是一个节点
根节点:树结构中的第一个节点就是根节点(网页对应树的根节点是html标签)
节点内容:双标签的标签内容
节点属性:标签的标签属性

2)路径 -

目标节点在整个树结构中的位置信息

2.xml数据格式

xml和json都是通用的数据格式,可以用于不同编程语言的程序之间进行数据交流。

json更小更快;xml更安全

用json和xml两种数据格式来传输一个班级的信息:

1)json

{"name": "Python2205","teacher": {"name": "余婷","tel": "110","age": 18},"students":[{"name": "小明", "age": 18, "tel": "120", "gender": "男"},{"name": "张三", "age": 22, "tel": "119", "gender": "女"},{"name": "老王", "age": 30, "tel": "140", "gender": "男"}]
}

2)xml

<class  name="Python2205"><teacher><name>余婷</name><tel isHome="是">110</tel><age>18</age></teacher><students><stu></stu><stu></stu><stu></stu></students>
</class>

04-xpath语法

from lxml import etree

1.创建树获取树的根节点

# etree.XML(xml数据)# etree.HTML(html数据)root = etree.XML(open('data.xml', encoding='utf-8').read())

2.通过xpath路径获取节点(标签)

节点对象.xpath(路径) - 获取指定路径对应的所有的标签

xpath语法(路径的写法):

1)绝对路径:

不管xpath点前面是哪个标签,绝对路径都是以’/'开头,从根节点开始往后写

staff_names = root.xpath('/supermarket/staffs/staff/name')
print(staff_names)# 在路径的最后加'/text()'可以获取标签内容result = root.xpath('/supermarket/staffs/staff/name/text()')
print(result)       # ['张三', '小明', '小花']# 注意:不断xpath前面是谁去点的,写绝对路径的时候都必须从根节点开始写goodsList = root.xpath('/supermarket/goodsList')[0]
result = goodsList.xpath('/supermarket/goodsList/goods/price/text()')
print(result)

2)相对路径:

在写路径的时候用’.‘表示当前节点,用’…'表示当前节点的上层节点。谁去点的xpath当前节点就是谁

result = root.xpath('./staffs/staff/name/text()')
print(result)goodsList = root.xpath('/supermarket/goodsList')[0]
result = goodsList.xpath('./goods/price/text()')
print(result)# 相对路径中'./'开头的时候,'./'可以不写result = goodsList.xpath('goods/price/text()')
print(result)

3)全路径:

在写路径的时候用’//'开头,获取标签的时候是在整个树中获取所有满足路径结构的标签

result = root.xpath('//name/text()')
print(result)result = root.xpath('//goods/name/text()')
print(result)

3. xpath的谓语(条件) -

在路径中需要添加条件的节点后加’[谓语]’

1)和位置相关条件

[N] - 第N个节点
[last()] - 最后一个节点
[last()-N] - [last()-1]: 倒数第2个
[position()>N]、[position()<N]、[position()>=N]、[position()<=N]

result = root.xpath('//staffs/staff[2]/name/text()')
print(result)result = root.xpath('//staffs/staff[last()]/name/text()')
print(result)result = root.xpath('//staffs/staff[last()-1]/name/text()')
print(result)result = root.xpath('//staffs/staff[position()<=2]/name/text()')
print(result)

2)和属性相关条件

[@属性名=值] - 获取指定属性为指定值的标签
[@属性名] - 获取拥有指定属性的标签

result = root.xpath('//goodsList/goods[@tag]/name/text()')
print(result)result = root.xpath('//goods[@tag="hot"]/name/text()')
print(result)

3)和子标签内容相关条件

[子标签名=值] - 获取指定子标签的标签内容为指定值的标签
[子标签名>值] - 获取指定子标签的标签内容大于指定值的标签

result = root.xpath('//goods[price=3.5]/name/text()')
print(result)result = root.xpath('//goods[count>=50]/name/text()')
print(result)

4.获取标签内容和标签属性

获取标签内容: 获取标签的路径/text() - 获取路径选中的所有的标签的标签内容
获取标签内容: 获取标签的路径/@属性名 - 获取路径选中的所有的标签的指定属性的值

result = root.xpath('//goods[2]/@tag')
print(result)goods_names = root.xpath('//goods/name')
for x in goods_names:print(x.xpath('./text()')[0])

5.统配符*

在xpath路径中可以用*来代替任何标签或者任何属性

result = root.xpath('//goods[1]/*/text()')
print(result)result = root.xpath('//*[@class="c1"]/text()')
print(result)result = root.xpath('//goodsList/goods[3]/@*')
print(result)

6.若干(分支) - |

# 路径1|路径2       -   依次获取|分开的所有路径对应的内容result = root.xpath('//goods/name/text()|//staff/name/text()')
print(result)

05-xpath解析豆瓣电影

import requests
from lxml import etree

1. 获取网页数据

headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250', headers=headers)

2.数据解析

root = etree.HTML(response.text)

方法1:

# all_name = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[1]/a/span[1]/text()')# scores = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[2]/div/span[@class="rating_num"]/text()')# print(all_name)# print(scores)

方法2:

all_div = root.xpath('//ol[@class="grid_view"]/li/div')for x in all_div:name = x.xpath('./div[@class="info"]/div[1]/a/span[1]/text()')[0]score = x.xpath('./div[@class="info"]/div[2]/div/span[2]/text()')[0]print(name, score)

06-常见的指令操作

常见的指令操作

执行指令的工具: Windows - 命令提示符(cmd) 、Mac - 终端

1.运行python程序: -

运算程序的计算机必须先安装python环境

win: python py文件路径
mac: python3 py文件路径

注意:windows使用python指令执行Python程序的时候必须保证写指令的位置和py文件在同一个盘下面;
如果不在同一个盘,执行指令前先切盘

2.进入文件夹: cd

cd 文件夹相对路径、文件夹绝对路径

注意:如果是windows操作系统,cd操作如果要跨盘需要先切盘,然后再cd
切盘方法:C:、E:、D:

3.查看当前文件夹的内容

​ win: dir
​ Mac:ls

4.用指令创建虚拟环境

第一步:找到一个用来放虚拟环境的文件夹
第二步:通过cd指令进入到存放虚拟环境的文件夹中

第三步:创建虚拟环境
python -m venv 虚拟环境名
python3 -m venv 虚拟环境名

第四步:激活虚拟环境
(mac) source 虚拟环境目录/bin/activate
(windows) 虚拟环境目录\ Scripts\activate.bat

​ 第五步:退出虚拟环境(回到系统环境)
​ deactivate

5.常用pip指令(pip - Python包管理工具)

​ pip list - 查看当前环境已经安装过的所有的第三方库

pip install 第三方库名称 - 下载并且安装指定的第三方库
​ pip install 第三方库名称 -i 镜像地址 - 在指定的镜像地址中下载安装
​ pip install 第三方库名称==版本号 -i 镜像地址

​ pip install 第三方库名称1 第三方库名称2

​ pip freeze > 依赖文件名 - 生成依赖文件
​ pip install -r 依赖文件路径 - 批量安装

​ pip uninstall 第三方库名称 - 卸载指定的第三方库

data

<supermarket><name>永辉超市</name><staffs><staff><name class="c1">张三</name><position>收营员</position><salary>3500</salary></staff><staff><name>小明</name><position class="c1">收营员</position><salary>3800</salary></staff><staff><name class="c1">小花</name><position>导购</position><salary>4500</salary></staff><staff><name>李华</name><position>导购</position><salary>5500</salary></staff></staffs><goodsList><goods><name class="c1">面包</name><price>5.5</price><count>12</count></goods><goods tag="hot"><name>泡面</name><price class="c1">3.5</price><count>59</count></goods><goods tag="discount" discount="0.8"><name>火腿肠</name><price>1.5</price><count>30</count></goods><goods tag="hot"><name>矿泉水</name><price>2</price><count>210</count></goods></goodsList></supermarket>

【千锋Python2205班10.21笔记-day05-xpath语法和指令系统(一阶段)】相关推荐

  1. 【千锋Python2205班9.20笔记-day02-python基础语法(一阶段)】

    01-review 1.注释 单行注释(ctr+/) """ 多行注释 """ ''' 多行注释 ''' 2.行和缩进 print(100) ...

  2. 【千锋Python2205班8.29笔记-day06-冒泡排序和字符串基础】

    01-homework 1.分别使用两种方法对列表去重 name_list = ['张三', '李四', '王五', '李四', '王五', '王五', '张三'] #间接删除 newList = [ ...

  3. 【千锋Python2205班8.25笔记-day04-循环和列表】

    01-homework 1.根据输入的成绩的范围打印及格或者不及格. score = float(input('请输入成绩:')) if score >= 60:print('及格') else ...

  4. 【千锋Python2205班9.29笔记-day09-字符串(一阶段)】

    01-review # 1. 元组(tuple) """ 容器:(数据1, 数据2, 数据3,...) 不可变的;有序的元素:没有要求 """ ...

  5. 千锋逆战班学习第二十五天

    千锋逆战班学习第25天 努力或许没有收获,但不努力一定没收获,加油. 今天我学了Java课程的集合. 中国加油!!!武汉加油!!!千锋加油!!!我自己加油!!! 4.有如下代码: public cla ...

  6. 千锋逆战班学习第二十三天 集合练习(一)

    千锋逆战班 在千锋"逆战"学习第23天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油! 2(List)有如下代码 import java.util. ...

  7. 千锋逆战班学习日志Day47

    千锋逆战班学习第47天 表单标签 CSS介绍 二.CSS和HTML结合 2.1CSS和HTML结合之内联结合 2.2CSS与HTML结合之内部部结合 2.3CSS和HTML结合之外部结合 三.访问路径 ...

  8. 千锋逆战班学习第二十四天

    千锋逆战班 在千锋"逆战"学习第24天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油! 1(Object类)有下面代码 interface IA{v ...

  9. 千锋逆战班学习的第17天,final

    千锋学习的第17天今天学习的是 三大修饰符final中国加油,武汉加油. 七(final属性的初始化)有如下代码 1) class MyClass{ 2) final in value; 3) pub ...

最新文章

  1. 艾伟:ASP.NET MVC,深入浅出IModelBinder,在Post方式下慎用HtmlHelper
  2. 如何启用计算机超级账户,Windows7启用超级管理员账户的方法
  3. 深入学习consul
  4. [js] 微信的JSSDK都有哪些内容?如何接入?
  5. 用ISA Server做***路由代替专线
  6. 孙高飞:人工智能测试_高飞学习钓鱼:为什么好的文档很重要
  7. java 项目拆分_java – 多模块项目什么时候应该拆分成单独的存储库树?
  8. Centos7下配置安装mysql5.5主从复制(一主两从)
  9. python 线程类
  10. vcpkg工具+vs2019
  11. 内行人看笑话 外行人一脸懵逼
  12. Xilinx SDx 2018.3安装
  13. 联想新服务器怎么装系统教程,联想小新重装win7系统的详细教程图解
  14. 在UE5中嵌入浏览器
  15. Maven仓库的使用
  16. 数据可视化作品有哪些
  17. orange pi php,在OrangePi Zero上使用Lighttpd+SQLite+PHP7搭建OwnCloud
  18. developerworks文章
  19. C#窗体将DGV控件中数据导入导出Excel表
  20. 迅闪3.1助手发现一个小BUG

热门文章

  1. 架构设计:系统间通信(31)——其他消息中间件及场景应用(下1)
  2. 【毕业季征文·未来可期】练武不练功,到头一场空
  3. Mqtt主题那点事(topic)
  4. 活动预约报名系统怎么做?快来借鉴「苍山徒步之家」的经验做法
  5. java实现验证验证歌德巴赫猜想(简易版)
  6. iOS友盟分享成功不走回调
  7. android wifi bssid是什么意思,安卓如何得到WiFi SSID,BSSID,及其区别。
  8. PMP的五大过程组和十大知识领域
  9. [201206][UML 精粹][标准对象建模语言简明指南][第3版][Martin Fowler][著]
  10. Vue 父子组件通信