python爬虫第一次实战(pycharm+Anaconda+scrapy)

1.使用scrapy startproject 文件夹名 创建scrapy的文件结构

 

2.在pycharm中安装scrapy时,因为缺少依赖包如pywin32或lxml等,因此crawl指令无法使用

 

3.安装Anaconda,安装时点选将路径加入用户变量,在Anaconda中安装scrapt,将Anaconda中的解释器设置为项目的外部解释器

 

4.在Anaconda prompt使用scrapy指令,如

    scrapy crawl names
    
    or
    
    scrapy runspider 文件名

以进行爬取。执行时路径应为spiders的上一级目录

 

5.pycharm的terminal调用Anaconda prompt:

在pycharm的settings中找到terminal的shell path,内容有cmd.exe改为cmd.exe "/K" E:\Anaconda3\Scripts\activate.bat E:\Anaconda3 (从路径为Anaconda prompt的路径)

 

6.发起请求,如:

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

用于在命令行中调试。

利用xpath获取元素,如:

response.xpath('//title/text()').get().split("|")[-2]

利用css元素也可以取得同样的效果:

response.css('title::text').get().split("|")[-2]

其中的text表示去除标签,只取得纯文本内容,也可使用 remove_tags()。

 

7.创建Item类,因为要取得标题和密码两个内容,所以

import scrapy

class TitleItem(scrapy.Item):
    title = scrapy.Field()
    psw = scrapy.Field()

 

8.爬虫的要求为爬取所有页面的所有链接,因此

import scrapy

from .titleItem import TitleItem

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    base_urls = '***' #初始页面
    pages_num = ***   #页数
    file_name = '***.txt' #写入的文件名

    def start_requests(self):
        urls = []
        urls.append(self.base_urls)
        for x in range(2, self.pages_num): #循环生成所有页面链接
            urls.append(self.base_urls + str(x)) 
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)


    def parse(self, response):
        #解析当前页面,并依次获取所需链接
        urls_more = response.xpath('//h1/a/@href').getall()
        for url_more in urls_more:
            yield scrapy.Request(url=url_more, callback=self.parse_more)

    def parse_more(self, response):
        #解析当前页面的title和psw
        item = TitleItem()

        item['title'] = response.css('title::text').get().split("|")[-2]
        #或者 response.xpath('//title/text()').get().split("|")[-2]
        #或者 item['title'] = remove_tags(item['title']) 除去标签

        item['psw'] = response.xpath('***').get()
        with open(self.file_name, 'a') as file_object: #以附加方式写入
            file_object.write(item['psw'])
            file_object.write(item['title'] + "\n")
        #yield item

 

注意: xpath可以在审查元素中获取;

            yield item会影响速度;

  yield item时可以使用以下命令将内容写入json文件

scrapy crawl quotes -o data.json

若显示中文为乱码,在settings文件中加入:

FEED_EXPORT_ENCODING = 'utf-8'

 

你可能感兴趣的:(Python)