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使用步骤:

  1. 新建文件夹(scrapyPro)存放scrapy文件
  2. 到scrapyPro目录下,执行:scrapy startproject scrapyOne
  3. 进入到scrapyOne下的spiders目录执行:scrapy genspider 爬虫名称 xxx.com
  4. 用编码工具修改settings.py 中的robots 设置为false
  5. 修改爬虫程序代码
  6. 运行爬虫: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_DOMAIN

    Cookie设置:COOKIES_ENABLED默认为true,下次请求带上cookie

    默认请求头设置:DEFAULT_REQUEST_HEADERS

    一系列中间件、缓存、http请求的配置等(不常用)

  • 爬虫项目的工程目录及各个组成的作用:

    scrapy.cfg:项目配置文件。

    settings.py:项目设置文件。

    pipelines.py:项目管道文件,主要用于对

    Items定义的数据进行加工与处理。

    middlewares.py:项目的中间件文件。

    items.py:项目的数据容器文件,用于定义获取的数据。

    init.py:初始化文件。

    spiders目录:爬虫目录,例如,创建文件、编写爬虫解析规则等

b.数据存储的四种格式

  1. 以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()
  2. 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()
  3. 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()
  4. 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)的更多相关文章

  1. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...

  2. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  3. Linux 安装python爬虫框架 scrapy

    Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...

  4. Python爬虫框架Scrapy实例(三)数据存储到MongoDB

    Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...

  5. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

    下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...

  6. Python爬虫框架Scrapy教程(1)—入门

    最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...

  7. 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

    目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...

  8. 《精通Python爬虫框架Scrapy》学习资料

    <精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA

  9. Python 爬虫七 Scrapy

    Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...

  10. python爬虫之scrapy框架

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

随机推荐

  1. i春秋Musee de X

    打开提示我们如果要操作就需要登录 题目也没有给出tips提示 /tmp/memes/wosun 注册成功后提示我们我们的文件被储存在了.....可能这道题会用到一句话木马,毕竟他目录都给我们了 然后去 ...

  2. MinioAPI浅入及问题

    MinioAPI浅入及问题 bucketExists(BucketExistsArgs args) boolean 判断桶是否存在 返回boolean boolean gxshuju = minioC ...

  3. 关于 Windows6.1-KB2999226-x64.msu 此更新不适用你的计算机解决办法

    前言 今天被这个破问题坑了很长时间,网上一大堆扯跳过那个检查,通过提取 cab 文件然后直接用命令安装,我可以明确的告诉你不是那样的解决的,因为我实际用命令装过也装不上(这里我吐槽一下,我猜你最初的问 ...

  4. integer 拆箱装箱以及范围

    //装箱是将一个原始数据类型赋值给相应封装类的变量.而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量. int i1 = 1; int i2 = 1; Integer integer1 = n ...

  5. day23 约束 & 锁 & 范式

    考点: 乐观锁=>悲观锁=>锁 表与表的对应关系 一对一:学生与手机号,一个学生对一个手机号 一对多:班级与学生,一个班级对应多个学生 多对一: 多对多:学生与科目,一个学生对应多个科目, ...

  6. 什么是JS?JS的用途?

    一.JavaScript是什么?它有什么作用? JavaScript是一种运行在客户端的脚本语言,简称JS,属于解释性语言.它是一行翻译执行完以后再进行下一行,代码不进行预编译. JavaScript ...

  7. 如何通过 C#/VB.NET 将 PDF 转为 Word

    众所周知,PDF 文档支持特长文件,集成度和安全可靠性都较高,可有效防止他人对 PDF 内容进行更改,所以在工作中深受大家喜爱.但是在工作中,我们不可避免的会对 PDF 文档进行修改或再编辑,这时我们 ...

  8. angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟

    ​ 转载请说明出处:信安科研人 please subscribe my official wechat :信安科研人 获取更多安全资讯 原文链接:sec22-vadayath.pdf (usenix. ...

  9. 【转载】解决CHM帮助文件无法从网络共享位置上直接打开的问题的方法

    近日在内网共享了些书籍,但发现其中的.chm文件竟然无法正常打开,而文件百分百是正常的..症状:无法从网上邻居的共享位置上直接打开.chm文件.从网络共享位置上打开.chm文件,显示为空白或运行不正常 ...

  10. Linux 环境中使用 LVGL

    之前有记录过在 esp32 中使用 LVGL 的笔记,需要的小伙伴可以了解一下,esp-idf 移植 lvgl8.3.3 我之前整理的学习资料:https://www.cnblogs.com/jzcn ...