欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用爬虫的小技巧

程序员文章站 2022-07-02 15:35:08
...

1.xpath的几种取值用法:

response.xpath('//*[@id="post-110287"]/div[1]/h1/text()').extract()

'//span[contains(@class, "yangshi")]/text()' #包含关系
'//span[@href="lianjie"]/h1/text()'
'//span[@id="post-110287"]/div[1]/h1/text()'
'//span[@class="entry-header"]/h1/text()'
response.xpath(u'//a[text()="下一页"]/@href').extract()  #直接文本相等  python2下,出现中文需要前面加u
response.xpath(u'//a[contains(text(),"下一页")]/@href').extract()  #文本间是包含关系 python2下,出现中文需要前面加u

//input[starts-with(@name,'name1')]     查找name属性中开始位置包含'name1'关键字的页面元素

//input[contains(@name,'na')]         查找name属性中包含na关键字的页面元素


2.css的几种取值方法:

response.css(".entry-header h1::text").extract() # .代表的是class #代表的是id
response.css('p.entry-meta-hide-on-mobile::text').extract()
response.css('a[href="#article-comment"]::text').extract()[0]

response.css('#archive .floated-thumb .post-thumb a::attr(href)').extract_first('') a标签的href属性取值;默认为空

response.css('.next.page-numbers::attr(href)').extract_first('空') 一个标签下的两个class,之间不需要空格进行连接

3.对比extract_first()和extract()[0],需要是最好采用extract_first()
extract_first()是代表取出数组里面的第一个数据,可以不用考虑异常情况;
extract()[0]也是代表取出数组里面的第一数据,但是异常情况处理不了;

4.url相加的方法:
from urllib import parse  #这是在python3中调用;
import urlparse  #这是在python2中的调用;
parse.urljoin(base,url)  #将url进行相加

5.获取meta中的数据
meta是Request函数中传入的参数值,传递到下一个函数,我们可以这样取值:

response.meta.get('image_url', '')  #使用get方法获取meta中的数据,不会报异常
response.meat['image_url','') #这样容易报异常。
6.ImagesPipeline 的使用方法:
第一步:

ITEM_PIPELINES = {
   'first_project.pipelines.FirstProjectPipeline': 300,
   'scrapy.pipelines.images.ImagesPipeline':1,  #配置ImagesPipeline
}
IMAGES_URLS_FIELD = 'get_image_url'  #将对准下载图片的url字段
BASE_DIR = os.path.abspath(os.path.dirname(__file__))  #获取和spider同级的路径,__file__代表的setting文件路径;
IMAGES_STORE = os.path.join(BASE_DIR, 'images')  #存放图片的下载路径
# IMAGES_MIN_HEIGHT = 100  #设置图片的最小高度,

# IMAGES_MIN_WIDTH = 100  #设置图片的最小宽度,
第二步:在和spdier同级的目录下创建一个images文件夹,用于存放图片。
第三步:要想使用和图片相关的模块,就需要安装PIL库, 终端命令:pip install pillow
第四步:安装完成后,运行项目,会报一个错:raise ValueError('Missing scheme in request url: %s' % self._url)
这是因为下载图片的时候,IMAGES_URLS_FIELD 里面的值会作为数组来处理,所以我们在spider中,将字段get_image_url 改为数组
类型即可。
这样基本完成imagepipeline,接下来,我们可以通过程序获取image的存储路径:
在pipelines.py文件中,继承ImagesPipeline

from scrapy.pipelines.images import ImagesPipeline
class JobbolePipeline(ImagesPipeline): #获取图片存储的路径;
    def item_completed(self, results, item, info):
        for ok, value in results:
            image_file_path = value['path']
        item['get_image_path'] = image_file_path

        return item
路径就会存入item中。
7.对数据字段进行md5加密:
在我们自己常用的工具包下创建common.py文件:

import hashlib

def get_md5(url):  #md5加密函数
    if isinstance(url, str):
        # python3中的str是unicode类型的
        url = url.encode('utf-8')
    m = hashlib.md5()
    m.update(url)  #url不能是unicode类型的,
    return m.hexdigest()

完成函数后,我们可以在spdier中使用它,来加密我们的数据;
8.将数据写入json文件中:
在pipelines.py文件中,创建类如下:
import codecs
import json
class JsonWithEncodingPipeline(object):
    def __init__(self):
        #codecs读取文件的包,比open包好用点
        self.file = codecs.open('article.json', 'w', encoding='utf-8') #两个控制编码的
    def process_item(self, item, spider):
        lines = json.dumps(dict(item), ensure_ascii=False) + "\n"  #控制编码的
        self.file.write(lines)
        return item
    def spider_closed(self, spider):
        self.file.close()  #关闭文件流
然后在setting.py文件中,的ITEM_PIPELINES添加我们刚刚写的JsonWithEncodingPipeline

9.安装pythonmsyql的驱动:
windows下安装:命令行执行 pip install -i https://pypi.douban.com/simple/ mysqlclient
ubuntu 下安装:终端执行 pip install -i https://pypi.douban.com/simple/ mysqlclient 这样会出现一个错误,
我们先执行:sudo apt-get install libmysqlclient-dev ,然后执行刚刚那行命令。
10.ItemLoader函数使用

from scrapy.loader import ItemLoader
item_loader = ItemLoader(item=JobboleItem(), response=response)
        # item_loader = JobboleItemLoader(item=JobboleItem(), response=response) #使用自定义的itmeloader
        item_loader.add_css('title', 'div.entry-header h1::text') #为字段添加css抓取, 还有add_xpath()是为字段添加xpath抓取
        item_loader.add_value('get_image_url', [get_image_url]) #为字段赋值
        item_loader.add_value('url_object_id', get_md5(response.url))
        item = item_loader.load_item()
        yield item
还可以在items.py文件中,对itme进行预处理:

from scrapy.loader.processors import MapCompose, TakeFirst
class JobboleItem(scrapy.Item):
    title = scrapy.Field(
        input_processor= MapCompose(lambda x:x + ".jobbole我的后缀" ,add_jobbole),               #当title从item传过来后,对值进行预处理。
        output_processor = TakeFirst()   #只去list中的第一个数据;
    )
    get_image_url = scrapy.Field()
    get_image_path = scrapy.Field()
    url_object_id = scrapy.Field()

    pass
11.python2和python3的兼容导包方式:
try:
    import cookielib
except:
    import http.cookiejar as cookielib
12.设置pycharm默认编码:
13.在spider爬虫的py文件中,我们要记得导入这个编码包:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
今天在这里坑了。
14.scrapy shell 的使用:
scrapy shell https://www.baidu.com
当需要使用user-agent的时候
scrapy shell -s USER_AGENT="" https://www.baidu.com

15.使用python中filter函数来过滤掉list中不需要的url

#all_urls 是一个list类型,将all_urls进行遍历,为True的就放入all_urls里面,为False的就过滤掉
all_urls = filter(lambda x:True if x.startswith('https') else Flase, all_urls)
16.在pipeline中获取item的名称:
item.__class__.__name__ == 'JobboleItem'
17.telnet的简单使用:
首先我们打开控制面板,进入到程序和功能,点击打开或关闭windows功能。里面有个telnet服务器,和telnet客户端,将这两个文件夹

打上勾,点击确认,就会自动添加安装,如果需要重启电脑就进行重启,
然后运行我们的scrapy项目,开始运行后会有监听端口打开:
开启我们的cmd,输入命令:telnet localhost 6023 就可以进入到里面了。