Scrapy - Extraindo Itens
Descrição
Para extrair dados de páginas da web, o Scrapy usa uma técnica chamada seletores com base em expressões XPath e CSS . A seguir estão alguns exemplos de expressões XPath -
/html/head/title - Isso selecionará o elemento <title>, dentro do elemento <head> de um documento HTML.
/html/head/title/text() - Isso selecionará o texto dentro do mesmo elemento <title>.
//td - Isso selecionará todos os elementos de <td>.
//div[@class = "slice"]- Isso selecionará todos os elementos de div que contêm um atributo class = "slice"
Os seletores têm quatro métodos básicos, conforme mostrado na tabela a seguir -
Sr. Não | Método e Descrição |
---|---|
1 | extract() Ele retorna uma string Unicode junto com os dados selecionados. |
2 | re() Ele retorna uma lista de strings Unicode, extraídas quando a expressão regular foi fornecida como argumento. |
3 | xpath() Ele retorna uma lista de seletores, que representa os nós selecionados pela expressão xpath fornecida como um argumento. |
4 | css() Ele retorna uma lista de seletores, que representa os nós selecionados pela expressão CSS fornecida como um argumento. |
Usando Seletores no Shell
Para demonstrar os seletores com o shell Scrapy integrado, você precisa ter o IPython instalado em seu sistema. O importante aqui é que os URLs devem ser incluídos entre aspas durante a execução do Scrapy; caso contrário, os URLs com caracteres '&' não funcionarão. Você pode iniciar um shell usando o seguinte comando no diretório de nível superior do projeto -
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Uma concha terá a seguinte aparência -
[ ... Scrapy log here ... ]
2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200)
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x3636b50>
[s] item {}
[s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] settings <scrapy.settings.Settings object at 0x3fadc50>
[s] spider <Spider 'default' at 0x3cebf50>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
In [1]:
Quando o shell é carregado, você pode acessar o corpo ou cabeçalho usando response.body e response.header, respectivamente. Da mesma forma, você pode executar consultas na resposta usando response.selector.xpath () ou response.selector.css () .
Por exemplo -
In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]
In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']
In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]
In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']
In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']
Extraindo os dados
Para extrair dados de um site HTML normal, temos que inspecionar o código-fonte do site para obter XPaths. Depois de inspecionar, você pode ver que os dados estarão noultag. Selecione os elementos dentroli tag.
As linhas de código a seguir mostram a extração de diferentes tipos de dados -
Para selecionar dados dentro da tag li -
response.xpath('//ul/li')
Para selecionar descrições -
response.xpath('//ul/li/text()').extract()
Para selecionar títulos de sites -
response.xpath('//ul/li/a/text()').extract()
Para selecionar links de sites -
response.xpath('//ul/li/a/@href').extract()
O código a seguir demonstra o uso dos extratores acima -
import scrapy
class MyprojectSpider(scrapy.Spider):
name = "project"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print title, link, desc