[Python] rastreador

Instalar scrapy

Crea un proyecto de araña

Use pycharm para abrir el 'proyecto:

Modificar el intérprete de python: el entorno virtual de anaconda myspark

Dos herramientas:

1.

scrapy view https://bj.lianjia.com/ershoufang/

ver puede descargar una página web al local, esta página web es la página que ve el rastreador. Nota: La página que ve el rastreador es algo diferente de la página que ve directamente en el sitio web de destino debido al procesamiento anti-rastreador.

La página web se ha descargado en el local

2.

scrapy shell https://bj.lianjia.com/ershoufang/

 Herramienta de shell para una depuración sencilla

Verifique los elementos de la página web ---> copiar xpath

sintaxis de xpath:

expresión

descripción

//

Seleccionar nodo, usar / representar anidamiento

.

Representa el elemento actual

. .

Representa el elemento padre del elemento actual

@

Seleccionar nodo por atributo

        xpath :       // * [@ id = "contenido"] / div [1] / ul / li [3] / div [1] / div [1] / a

response.xpath ('// * [@ id = "contenido"] / div [1] / ul / li [3] / div [1] / div [1] / a / text ()')

Demuestre que los datos se pueden obtener

Proceso

1. Analizar los datos:

Escriba el código del rastreador:

# -*- coding: utf-8 -*-
import scrapy

from myfirstspider.items import MyfirstspiderItem


class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = ['https://bj.lianjia.com/ershoufang/']

    def parse(self, response):
        
        # 一个一个爬去
        
        # housename=response.xpath('//*[@id="content"]/div[1]/ul/li[3]/div[1]/div[1]/a/text()').extract_first()
        # price=response.xpath('//*[@id="content"]/div[1]/ul/li[3]/div[1]/div[6]/div[1]/span/text()').extract_first()
        #
        # item=MyfirstspiderItem()
        # item["housename"]=housename
        # item["price"] = price
        # return item

        #多个爬取
        
        li_list=response.xpath('//*[@id="content"]/div[1]/ul/li')
        for li in li_list:
            item=MyfirstspiderItem()
            # .表示当前元素
            item["housename"] = li.xpath('./div[1]/div[1]/a/text()').extract_first()
            item["price"] =li.xpath('.//div[1]/div[6]/div[1]/span/text()').extract_first()
            yield item

2. Crea una instancia:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class MyfirstspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    housename = scrapy.Field()
    price = scrapy.Field()

3. Configure el middleware (opcional):

4. Habilite la canalización:

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


class MyfirstspiderPipeline(object):
    def process_item(self, item, spider):
        with open("house.txt","a") as f:
            content="{},{}\n".format(item["housename"],item["price"])
            f.write(content)
        return item

5. Habilite la configuración

a. La configuración no cumple con el acuerdo de robots:

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

b. Abrir la canalización: descomentar

ITEM_PIPELINES = {
   'myfirstspider.pipelines.MyfirstspiderPipeline': 300,
}

6. Inicie el rastreador

Comandos de shell comunes

puesta en marcha:

resultado:

顺驰领海 东门大三居 南北通透,630
亦庄与通州交界处 润枫领尚小区两居室 看房方便,340
南北通透挂西窗 全明格局 前后不临街,940
满五唯一商品房 板楼 层高三米,430
精装修 中楼层 南北通透 满五唯一,133
None,None
四环内韩庄子四里 满五唯一 正规三居室带阳台 中间层,356
世嘉丽晶 南北两居 落地窗 满五唯一2004年商品房,386
梧桐苑南北小三居无遮挡房主诚心出售,400
西四环低密度德式花园下跃复式房源,1195
怡海恒泰园南北通透两居,产权清晰方便看房,低楼层,436
全西开间,采光视野很好,装修不错,380
南北一居,小区内有公立幼儿园、业主优先入园。,285
四环内 正规朝南一居室,楼层好,看房方便,266
郁花园一里 精装修 看房方便 落地飘窗,280
沸城南向两居室 看房方便 业主诚心出售,349
天下儒寓 一室一厅 南向 采光充足,270
西南四环科技园  精装  南北两居  诚意出售,360
户型方正,电梯房,采光好,小区东侧对面就是森林公园,1548
四环内 地铁旁 低楼层 满五唯一,329
南北通透  把边户型  有钥匙 随时看,257
南北向小两居 有钥匙看房方便 诚心出售,228
大峪南路一居室南北通透楼层适中,已满两年,143
南北通透 满五唯一 电梯高层板楼 业主诚心出售,488
全南精装小两居,阳光充足,视野开阔,拎包入住。,261
南北通透 带电梯 两居室 采光好,305
朝阳金台路道家园满五年唯一南北两居室,355
果园地铁 大两居 满五唯一 精装修 诚心卖 带电梯,460
满五唯一 南北通透 中间楼层 交通便利 配套成熟,470
大井南里,南北通透两居室,地铁14号线,看房方便,275
宋家庄地铁  政馨园一区  269万  满五年唯一商品房,269

ps1: Establecer cambio de página:

# -*- coding: utf-8 -*-
import scrapy
from crawlpage.items import BookItem

class ExampleSpider(scrapy.Spider):
    # 爬虫名称,执行爬虫命令scrapy crawl name  时对应起来
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = []
    for page in range(1, 50):
        start_urls.append('http://www.bookschina.com/kinder/54000000_0_0_11_0_1_'+str(page)+'_0_0/')

    def parse(self, response):
        links = response.xpath('//*[@id="container"]/div/div/div/ul/li')

        for link in links:
            item = BookItem()

            item['title'] = link.xpath('div[2]/h2/a/text()').extract()[0]

            item['author'] = link.xpath('div[2]/div/a[1]/text()').extract()[0]
            yield item
            #item['category'] = link.xpath('div/div[1]/span[3]/text()').extract()[0].strip().split('|')[1]

            #url = link.xpath('div[1]/div[1]/a/@href').extract()[0]

            #yield scrapy.Request(,callback=self.parse_detail,meta={'item':item},dont_filter=True)


    def parse_detail(self, response):
        item = response.meta['item']
        yield item

ps2: conectarse a la base de datos

Archivo de canalización:

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymysql.cursors

class MysqlPipeline(object):
    def open_spider(self,spider):
        self.mysql_conn = pymysql.connect(host='127.0.0.1',user='root',password='123456',database='bookrecommend',charset='utf8',cursorclass=pymysql.cursors.DictCursor)

    def process_item(self, item, spider):
        if 'book' == item.className:
            pass

            sql_insert = 'insert into book values (%s,%s,%s,%s)'

            with self.mysql_conn.cursor() as cursor:
                cursor.execute(sql_insert, (1, item.get('title', ''),item.get('author', ''),'文学'))
                
            self.mysql_conn.commit()
        return item

    def close_spider(self, spider):
        self.mysql_conn.close()
        pass

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/Qmilumilu/article/details/104802591
Recomendado
Clasificación