python 网络爬虫开发第四天

本文详细介绍Python网络爬虫开发中虚拟环境的搭建与XPath的使用技巧,涵盖XPath语法、节点关系及如何通过XPath提取HTML数据,适合初学者快速掌握核心概念。

搭建虚拟环境(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值