python爬虫(含scrapy)
python爬虫
1.解析HTML:
lxml 是一种python编写的库,可以迅速、灵活的处理xml和html
使用:根据版本的不同,有如下两种:
形式1:
from lxml import etree
转换成树形结构对象:
obj=etree.HTML(htmlStr)
形式2:
from lxml import html
getHtml=requests.get(url,headers=header)
htmlObj=html.fromstring(getHtml.content.decode("utf8"))
htmlObj.xpath("")
a、xpath语法:
| 表达式 | 说明 |
|---|---|
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
| @ | 选取属性 |
| . | 选择当前节点 |
| 节点名 | 1选取此节点所有子节点 |
| //book | 选取所有book子元素,而不管它们在文档中的位置 |
| div//book | 选择属性div元素的后代的所有book元素,而不管它们位于div之下的什么位置 |
| //@lang | 选取名为lang的所有属性 |
b、举例
| 路径表达式 | 结果 |
|---|---|
| /div/div[1] | 选取数据div元素的第一个div元素 |
| /div/div[last()] | 选取属于div元素的最后一个div元素 |
| /div/div[last()-1] | 选取属于div元素的倒数第二个div元素 |
| /div/div[position() < 3] | 选取最前面的两个属于div元素的子元素的book元素 |
| //title[@lang] | 选取所有拥有名为lang属性的title元素 |
| //title[@lang='eng'] | 选取所有lang属性值为eng的title元素 |
2.解析json
import json
str='{"result":0,"data":[{"id":"664","numbers":"42235"}],"msg":"\u6210\u529f"}'
obj=json.loads(str)
xxrs=obj['data'][0]['numbers']
print(xxrs)#结果:42235
3.正则表达式
菜鸟教程:https://www.runoob.com/python/python-reg-expressions.html
正则表达式:
| 字符 | 描述 |
|---|---|
| […] | 用来表示一组字符, 单独列出, 例如, [amk]匹配a, m或k |
| [^…] | 不在[]中的字符, 例如, [^abc]匹配除了a, b, c之外的字符 |
| * | 匹配0个或多个的表达式 |
| + | 匹配1个或者多个的表达式 |
| ? | 匹配0个或1个由前面的正则表达式定义的片段, 非贪婪方式 |
| 精确匹配n次前面的表示 | |
| 匹配n到m次由前面的正则表达式定义的片段, 贪婪模式 | |
| a|b | 匹配a或者b |
| ( ) | 匹配括号内的表达式, 也表示一个组 |
| 实例 | 描述 |
|---|---|
| [Pp]ython | 匹配 "Python" 或 "python" |
| rub[ye] | 匹配 "ruby" 或 "rube" |
| [aeiou] | 匹配中括号内的任意一个字母 |
| [0-9] | 匹配任何数字。类似于 [0123456789] |
| [a-z] | 匹配任何小写字母 |
| [A-Z] | 匹配任何大写字母 |
| [a-zA-Z0-9] | 匹配任何字母及数字 |
| [^aeiou] | 除了aeiou字母以外的所有字符 |
| . | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
|---|---|
| \d | 匹配一个数字字符。等价于 [0-9]。 |
| \D | 匹配一个非数字字符。等价于 [^0-9]。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
| \S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
| \w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
| \W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
a.常用方法:
- re.findall()
使用案例:
import re
a="声明:python是一门简单的语言!python是一门好用的语言!"
#findall() 返回数据为list格式
result=re.findall("python(.*)!",a)# ['是一门简单的语言!python是一门好用的语言']
result2=re.findall("python(.*?)!",a)#['是一门简单的语言','是一门好用的语言']
# (.*)贪婪匹配,会尽可能的往后匹配
# (.*?) 非贪婪匹配,会尽可能少的匹配,是否加?影响匹配结果的长度
4.scrapy使用步骤:
- 新建文件夹(scrapyPro)存放scrapy文件
- 到scrapyPro目录下,执行:scrapy startproject scrapyOne
- 进入到scrapyOne下的spiders目录执行:scrapy genspider 爬虫名称 xxx.com
- 用编码工具修改settings.py 中的robots 设置为false
- 修改爬虫程序代码
- 运行爬虫:scrapy crawl 爬虫名称
a.scrapy使用小知识
Settings.py文件介绍:
项目名:BOT_NAME = ‘xxxx‘
遵循ROBOT协议:ROBOTSTXT_OBEY = False
用户身份:USER_AGENT =‘xxxx’
最大并发数:CONCURRENT_REQUESTS=32默认为16
下载延迟:DOWNLOAD_DELAY = 3
每个域名最大并发数:CONCURRENT_REQUESTS_PER_DOMAINCookie设置:COOKIES_ENABLED默认为true,下次请求带上cookie
默认请求头设置:DEFAULT_REQUEST_HEADERS一系列中间件、缓存、http请求的配置等(不常用)
爬虫项目的工程目录及各个组成的作用:
scrapy.cfg:项目配置文件。
settings.py:项目设置文件。pipelines.py:项目管道文件,主要用于对
Items定义的数据进行加工与处理。
middlewares.py:项目的中间件文件。
items.py:项目的数据容器文件,用于定义获取的数据。
init.py:初始化文件。
spiders目录:爬虫目录,例如,创建文件、编写爬虫解析规则等
b.数据存储的四种格式
以txt文本形式存储:
class xxxxPipeline:
def __init__(self):
self.file=open("test.txt","w",encoding="utf8") def process_item(self,item,spider):
row='{},{},{},{}\n'.format(item['name'],
item['age'],item['zy'],item['dy'])
self.file.write(row)
return item
def close(self):
self.file.close()
CSV格式
import csv class xxxxPipeline:
def __init__(self):
self.file = open('../moot2.csv','a',encoding='utf-8',newline='')
self.writer = csv.writer(self.file,delimiter=';')
self.writer.writerow(['表头1','表头2',.....]) def process_item(self,item,spider):
self.writer.writerow([item['title'],item['price'],......])
return item
def close(self):
self.file.close()
json格式:
import json class xxxxPipeline:
def __init__(self):
self.file = open('../moot2.json','a',encoding='utf-8') def process_item(self,item,spider):
jsonstr = json.dumps(dict(item),ensure_ascii=False)
self.file.write(jsonstr+'\n')
return item
def close(self):
self.file.close()
mysql存储
import pymysql class xxxxPipeline:
def __init__(self):
self.conn = pymysql.connect(host='IP/localhost',
user='root',password='123456',
port=3306,db='数据库名')
self.cursor = self.conn.cursor() def process_item(self,item,spider):
sql = "insert into tb_moot values(null,%s,%s,......)"
self.cursor.execute(sql,(item['title'],item['price'],.......))
self.conn.commit()
return item def close(self):
self.cursor.close()
self.conn.close()
python爬虫(含scrapy)的更多相关文章
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- Linux 安装python爬虫框架 scrapy
Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...
- Python爬虫框架Scrapy实例(三)数据存储到MongoDB
Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...
- 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码
下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...
- Python爬虫框架Scrapy教程(1)—入门
最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...
- 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...
- 《精通Python爬虫框架Scrapy》学习资料
<精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA
- Python 爬虫七 Scrapy
Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...
- python爬虫之scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
随机推荐
- Bigkey问题的解决思路与方式探索
作者:vivo 互联网数据库团队- Du Ting 在Redis运维过程中,由于Bigkey 的存在,会影响业务程序的响应速度,严重的还会造成可用性损失,DBA也一直和业务开发方强调 Bigkey 的 ...
- MinioAPI浅入及问题
MinioAPI浅入及问题 bucketExists(BucketExistsArgs args) boolean 判断桶是否存在 返回boolean boolean gxshuju = minioC ...
- Codeforces Round #836 (Div. 2) A-D
比赛链接 A 题意 给一个字符串 \(s\) ,对其加倍,即每个字符后面追加一个相同字符. 加倍后可以重排列,要求构造一个回文串. 题解 知识点:构造. 既然可以重排列了,那顺序是随意的了,直接翻转加 ...
- MIUI12解决安装charles抓包安装证书后还是提示证书不安全
前言 我抓包这么长时间,这个问题我还是第一次遇到,导致我反复试验,明明安装证书还是提示不安全.我用新买的手机MIUI 12系统弄了半天 解决方案 首先下载证书这部分是一个坑,小米 MIUI 12系统下 ...
- 【SQL查询】必会的常用函数:条件函数、日期函数、文本函数、窗口函数
〇.概述 1.内容 选择(双分支.多分支) 一.条件函数 1.计算25岁以上和以下的用户数量 CASE THEN END多分支选择 SELECT (CASE WHEN age>=25 THEN ...
- 【每日一题】【与运算判断奇偶】【list的重载前后插入】2021年11月25日-103. 二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,null,15,7], 来源:力扣 ...
- 时隔3个月,Uber 再遭数据泄露...
在今年9月,Uber 就发生过一起数据泄露事件,尽管黑客并无意发动大规模攻击或以此来获取巨额利益,但其成功获取对 Uber 所有敏感服务的完全管理员访问权限仍令人后怕.而在上周,名为"Ube ...
- python Flask 操作数据库(2)
单表操作 数据准备 from flask import Flask from flask_sqlalchemy import SQLAlchemy class Config: DEBUG = True ...
- C++进阶(哈希)
vector容器补充(下面会用到) 我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间.而是以原大小 ...
- 物联网 IOT 设备如何脱离信息孤岛?
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/tb5eOFNUZLtPPLipLAh3vA 本文大概 1435 个 ...