[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/We2one/Notes/master/python-basic-notes/python-days/Day_58.md [Back]  [Original]

### Scrapy 

#### Scrapy 

+ Scrapy 
+ Scrapy  **Twisted **,,,.

#### Scrapy 

##### Scrapy 

+ **Scrapy Engine () ** :  spiderItemPipelineDownloaderScheduler 
+ **Scheduler () ** :  Requests ,,,,
+ **Downloader () ** :  Scrapy Engine ()  Requests , Responses  Scrapy Engine () ,  spider 
+ **spider () ** :  Response,, Item , URL , Scheduler ()
+ **Item Pipeline () ** :  spider  Item,  ()
+ **Downloader Middlewares () ** : 
+ **SpiderMiddlewares (spider ) ** : ******** **spider**  ( spider  Response   spider  Requests)

##### Scrapy 

1.  spider 
2. spider  
3.  spider   URL
4. spider   URL
5.  request  
6. , request  
7.   request 
8. request 
9. ,;,,
10.    spider (responses  def parse() )
11.  spider ,  :  URL   Item 
12.   Item ,  URL  ,,
13.    requests , ( URL , Scrapy )

##### Scrapy 

1.  (Scrapy startproject project_name) : 
2.  ( item.py) : 
3.  (spiders/xxspider.py) : 
4.  (pipelines.py) : 

#### Scrapy 

##### spider

+ spider , : ()( item)
+ **class Scrapy.spider** : ,
+ ********
  1. `__init__()` :  start_urls( url) 
  2. `start_requests()` :  `make_requests_from_url()`  Requests  Scrapy  response
  3. `parse()` :  response,  item  Requests ().Item  Item pipline , Requests  Scrapy ,  ( parse()).,
+ ********
  1. `name` :  spider  ( mywebsite.com , spider  mywebsite)
  2. `allowed_domains` :  spider ,
  3. `start_urls` :  URL . URL ,spider 
  4. `start_requests(self)` :  (iterable) . spider  Request
  5. `parse(self, response)` :  URL , Request . response ,  Item  Request 

##### Parse() 

+ Parse()  **yield** ,,Scrapy  parse ,
  +  **request** : 
  +  **item** :  pipeline ,
  +  : 
+ Parse() 
  + Scrapy  request ,,
  +  request,  item,  item  pipeline 
  + parse()  (callback)  Request, parse()  `Scrapy.Request(url, callback=self.parse)`
  + Request , `Scrapy.http.response()` ,  parse() , Request ()
  +  parse() ,   pipelines 

##### Logging

+ Scrapy  **(log)** ,  logging  **settings.py** , 

  ```python
  LOG_FILE = "text.log"
  LOG_LEVEL = "INFO"
  ```

+ Log levels : Scrapy  5  logging 

  1. **CRITICAL** :  (critical)
  2. **ERROR** :  (regular errors)
  3. **WARNING** :  (warning messages)
  4. **INFO** :  (informational messages)
  5. **DEBUG** :  (debugging messages)

+ logging  :  **settings.py**  logging

  + **LOG_ENABLED** : : True,  logging
  + **LOG_ENCODING** : : "utf-8", logging 
  + **LOG_FILE** : : None,  logging 
  + **LOG_LEVEL** : : "DEBUG",log 
  + **LOG_STDOUT** : : False, True,() log 

##### Robots  ()

+ Robots  ( Robots Exclusion Protocal) :  robots ,

+ scrapy ,  **settings.py**  : ROBOTSTXT_OBER = False

+  robots : [https://www.hupu.com/robots.txt](https://www.hupu.com/robots.txt)

  ```
  User-agent: *
  Allow: /
  
  Sitemap: https://bbs.hupu.com/sitemap_index.xml
  Sitemap: https://bbs.hupu.com/sitemap/sitemap_boards.xml
  Sitemap: https://voice.hupu.com/sitemap_index.xml
  Sitemap: https://nba.hupu.com/players/index.xml
  ```


#### Scrapy 

##### Scrapy 	

1. 

   ```python
   class HupuSpiderSpider(scrapy.Spider):
       name = 'hupu_spider'
       # , 
       # allowed_domains = ['www']
       start_urls = []
       for i in range(1, 101):
           base_url = f"http://voice.hupu.com/news?category=all&page={i}"
           start_urls.append(base_url)
   ```

2.  **settings.py**

   1. 

      ```python
      # Override the default request headers:
      DEFAULT_REQUEST_HEADERS = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/86.0.4240.111 Safari/537.36',
      }
      ```

   2.  ROBOTS 

      ```python
      # Obey robots.txt rules
      ROBOTSTXT_OBEY = False
      ```

3.  **parse** 

   1. scrapy  response 
      1. response.text : 
      2. response.content : 
      3. response.xpath() : xpath , lxml 
         +  *[]* 
         + 
           1. .`.extract()` :  selector   data,  list
           2. `.extract_first()` :  
   2. scrapy 
      + `yield scrapy.Request(url, callback=self.parse_detail,encoding='utf-8')`
      + 
        + **Request()** : 
        + **url** :  request  url
        + **callback** : scrapy

4. 

   1.  parse  `yield item`

      ```python
      def parse_detail(self, response):
          news_title = response.xpath('//h1[@class="headline"]/text()').extract_first()
          news_source = response.xpath('//span[@id="source_baidu"]/a/text()').extract_first()
          news_data = response.xpath('//span[@id="pubtime_baidu"]/text()').extract_first()
          news_content = response.xpath('string(//div[@class="artical-main-content"])').extract_first()
          item = HupuNewsItem()
          item['news_url'] = response.url
          item['news_title'] = news_title
          item['news_source'] = news_source
          item['news_data'] = news_data
          item['news_content'] = news_content
          yield item
      ```

   2.  item  :  item.py 

      ```python
      class HupuNewsItem(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          news_url = scrapy.Field()
          news_title = scrapy.Field()
          news_source = scrapy.Field()
          news_data = scrapy.Field()
          news_content = scrapy.Field()
      ```

   3.  **pipelines.py** 

      ```python
      class HupuNewsPipeline:
      
          def __init__(self):
              self.client = pymongo.MongoClient()
              self.db = self.client['hupu_news']
      
          def process_item(self, item, spider):
              self.db['NBA'].update({'news_url': item['news_url']}, {'$set': dict(item)}, True)
              print(item)
              return item
      ```

   4.  **setting.py**  pipelines 

      ```python
      # Configure item pipelines
      # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
      ITEM_PIPELINES = {
         'hupu_news.pipelines.HupuNewsPipeline': 300,
      }
      ```

5.  spiders   **main.py** : , main.py 

   ```python
   from scrapy import cmdline
   
   cmdline.execute('scrapy crawl company_spider'.split())
   ```


##### 

1.  Scrapy : `pip install scrapy`
2.  : `scrapy startproject `
3.  spider : `scrapy genspider (name) www` (www: )
4. 
5.  : `scrapy crawl (name )`


Web Proxy Viewer  |  New URL  |  Original Page