搭建虚拟环境(python3)
mkvirtualenv --python=E:\py3\python.exe article
mkvirtualenv --python=E:\py3\python.exe 文件夹名
搭建好了 第二次进入使用workon
workon article
deactivate 退出
安装scrapy
pip install -i https://pypi.douban.com/simple/ scrapy
在存放虚拟环境的文件夹旁创建一个存放项目的文件夹
workon虚拟环境
在其中新建scrapy项目
scrapy startproject ArticleSpider
用pycharm打开创建的工程
setting配置文件
pipelines和数据存储相关
middlewares自定义 自己定制变得更加可控
items 定义保存格式
提供了一个命令
先进入创建好的目录(工程目录)
scrapy genspider example example.com 创建一个爬取目标网站的模板(预设模板)
导入虚拟环境
setting project interpreter
找到scripts下的python.exe
启动命令
之前安装windows支持包
pip install -i https://pypi.douban.com/simple pypiwin32
执行环境 虚拟环境 工程目录下
scrapy crawl jobbole
调试
setting
Obey robots.txt rules
将此选项设置为False不遵循robot
再写一个main文件
再main文件中调用命令行
在main()文件中调试
#内置函数 在scrapy里面 包cmdline 中函数execute
#可以调用scrapy脚本
from scrapy.cmdline import execute
import sys
#设置工程目录 之后调用execute才会生效 换机器需要重新设置 麻烦
sys.path.append(“路径”)
#获取当前py文件路劲
os.path.abspath(__file__) #获取到我们mian文件路径
os.path.dirname() #获取父目录(所在文件夹路径)
#把启动命令配置到main文件
execute(["scrapy","crawl","jobbole"])
#在parse函数下断 查看response参数 发现body返回了网页内容
#200 返回正常
demo
from scrapy.cmdline import execute ##可以执行脚本
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
print(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy","crawl","jobbole"])
xpath简介
1.xpath使用路径表达式在xml和html中进行导航。
2.xpath包含了标准函数库
3.xpath是w3c的标准
xpath节点关系
1.父节点(上边一层)
<title>的父节点是<head>
2.子节点(下边一层)
<head>的子节点是<title>
3.同袍节点(兄弟节点)
同级,大家都在一个大标签下
4.先辈节点
父节点都是祖先结点
5.后代结点
子节点都是后代节点
xpath语法
1.article 选取所有article元素的所有子结点(结点=标签)
2./article 选取根元素article(一般都是html xml可以自定义)
3.article/a 选取所有属于article的子元素的a元素(只能提取后一代的)
4.//div 选取所有div子元素(不论出现在文档的任何地方)
5.article//div 选取所有属于article元素的后代的div元素,不管他出现在article之下的任何位置
6.//@class 选取所有名为class的属性(herf,input)
7./article/div[1] 选取属于article子元素的第一个div元素
8./article/div[last()] 选取属于article子元素最后一个div元素
9./article/div[last()-1]选取属于article子元素倒数第二个div元素
10.//div[@lang] 选取所有拥有lang属性的div元素
11.//div[@lang='eng']选取所有lang属性为eng的div元素
12./div/* 选取属于div元素的所有子节点
13.//*选取所有元素
14//div[@*]选取所有带属性的title元素
15./div/a|//div/p 选取所有div元素的a和p元素
16.//span|//ul 选取文档中的span和ul元素
17.article/div/p | //span选取所有属于srticle元素的div元素的p元素 以及文档中所有的span元素
通过Xpath提取出html中的值
#example.py
def parse(self, response):
re_selector=response.xpath("/html/body/div[2]/div[7]/div[1]/h1/text()") #返回了一个select的list
re1_selector = response.xpath('//*[@id="post-89316"]/div[1]/h1/text()') #text返回了一个文本
re2_selector = response.xpath('//div[@class="entry-header"]/h1/text()')
pass
#简易 id定位
#提供命令
(python -m )scrapy shell example.com //(在shell下调试)
#使用控制台调试
title = response.xpath('//div[@class="entry-header"]/h1/text()')
title
#直接打印出title的值
title.extract()
#把title使用extract方法按照数组形式取出来
title.extract()[0]
#把数组首元素,我们需要的字符提取出来
#之后根据上述方法找到时间的xpath
date = response.xpath("//p[@class='entry-meta-hide-on-mobile']")
response.xpath("//p[@class='entry-meta-hide-on-mobile']").extract()
#超长一串 为了获取信息,我们只获取它的text
response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()
response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0]
#用strip方法过滤掉回车换行符
response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip()
#replace方法把·替换成空
response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip().replace("·","")
#消除掉最后一个空格
response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip().replace("·","").strip()
//contains内置函数 选择多个class中的一个
response.xpath("//span[contains(@class,'vote-post-up')]/h10/text()")
a=int(response.xpath("//span[contains(@class,'vote-post-up')]/h10/text()").extract()[0])
#老规矩 上套路 最后转换一手int类型
match = re.match(".*(\d+).*",a)
response.xpath("//span[contains(@class,'href-style bookmark-btn')]/text()").extract()[0]#收藏数
#返回 4收藏
response.xpath("//span[contains(@class,'hide-on-480')]/text()").extract()[0]#点赞数
#返回 1点赞
#使用正则表达式过滤
import re
re.match(".*(\d+).*",response.xpath("//span[contains(@class,'href-style bookmark-btn')]/text()").extract()[0])
#提取正文(包括样式的所有格式)
response.xpath("//div[@class='entry']").extract()[0]
分离数组
tag_list =['职场','1 评论','xixixi']
tag_list=[element for element in tag_list if not element.strip().endswith("评论")]
tags=",".join(tag_list)
#去掉评论结尾的字符
python demo
# -*- coding: utf-8 -*-
import scrapy
import re
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://python.jobbole.com/89316/']
def parse(self, response):
title = response.xpath('//*[@id="post-89316"]/div[1]/h1/text()').extract()[0]
print(title)
Cdate = response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract()[0].strip().replace("·","").strip()
pinglun=int(response.xpath("//span[contains(@class,'vote-post-up')]/h10/text()").extract()[0])
shoucang=response.xpath("//span[contains(@class,'href-style bookmark-btn')]/text()").extract()[0] # 收藏数
dianzan=response.xpath("//span[contains(@class,'hide-on-480')]/text()").extract()[0] # 点赞数
#正文
response.xpath("//div[@class='entry']").extract()[0]
a=re.match(".*(\d+).*", shoucang)
print(Cdate,pinglun,a.group(1),dianzan)
pass