Python爬蟲學習筆記總結(二)

2021-02-20 python

五 資料庫存儲爬取的信息(MySQL)

爬取到的數據為了更好地進行分析利用,而之前將爬取得數據存放在txt文件中後期處理起來會比較麻煩,很不方便,如果數據量比較大的情況下,查找更加麻煩,所以我們通常會把爬取的數據存儲到資料庫中便於後期分析利用。

這裡,資料庫選擇MySQL,採用pymysql這個第三方庫來處理python和mysql資料庫的存取,python連接mysql資料庫的配置信息

db_config ={
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'password': '',
    'db': 'pytest',
    'charset': 'utf8'
}

以爬取簡書首頁文章標題以及url為例,先分析抓取目標信息,

如上圖,文章題目在a標籤中,且url(href)只含有後半部分,所以在存儲的時候,最好把它補全。

mysql:新建一個資料庫pytest,建立一張名為titles的表,表中欄位分別為id(int自增),title(varchar),url(varchar),如下:

進行資料庫操作的思路為:獲得資料庫連接(connection)->獲得遊標(cursor)->執行sql語句(execute)->事物提交(commit)->關閉數據據庫連接(close),具體代碼實現如下:



from urllib import request
from bs4 import BeautifulSoup
import pymysql


db_config ={
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'password': '',
    'db': 'pytest',
    'charset': 'utf8'
}

connection = pymysql.connect(**db_config)










url = r'http://www.jianshu.com/'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
soup = BeautifulSoup(page_info, 'html.parser')
urls = soup.find_all('a', 'title')

try:
    
    with connection.cursor() as cursor:
        sql = 'insert into titles(title, url) values(%s, %s)'
        for u in urls:
            
            cursor.execute(sql, (u.string, r'http://www.jianshu.com'+u.attrs['href']))
    
    connection.commit()
finally:
    
    connection.close()

代碼執行結果:

六、Scrapy初體驗

之前大概學習了下通過urllib和Beautiful Soup 進行簡單數據爬取的流程,但是那隻適用於一些簡單的、數據量比較小的爬蟲項目,如果需要爬取的數據量比較大的話,之前的方法必定非常緩慢,所以就有了Scrapy,Scrapy是一個快速的web抓取框架,可抓取web站點並從頁面中提取結構化的數據。Scrapy給我們提供了許多的爬蟲基類,我們可以直接繼承使用,當然,既然Scrapy是一個框架,我們也可以根據自己的需要對它進行修改,下面我們就慢慢來看Scrapy的使用。

(一)安裝(Windows)

Scrapy是純Python編寫的,所以需要一些比較重要的的Python依賴包:

lxml, an efficient XML and HTML parser

parsel, an HTML/XML data extraction library written on top of lxml,

w3lib, a multi-purpose helper for dealing with URLs and web page encodings

twisted, an asynchronous networking framework

cryptography and pyOpenSSL, to deal with various network-level security needs

看著依賴包比較多,其實安裝起來並不複雜,以管理員的身份運行Windows命令提示符,在以安裝Python的前提下,運行:

pip install scrapy

pip會自動下載相關依賴包,如果順利的話,會直接安裝完成。

要注意的是,確認一下python的版本,pip會根據系統自動安裝相關包,即如果系統是64位的,pip就會安裝64位的包,但是twisted的版本一定要和python的一樣,如果作業系統是64位的,python是32位的,pip直接安裝的twisted安裝就會出錯。

如果pip安裝twisted時出錯,在命令行輸入python,查看本地python版本,然後到這裡下載和python版本相同的whl文件,使用pip install  xxx.whl安裝,完成後再執行一遍pip install scrapy即可。

在命令行輸入scrapy, 若不報錯,則安裝完成。

(二) 第一個Scrapy項目


照例,先上官方文檔 1.3,找了一下網上翻譯的文檔都是0.24或者0.24版,所以建議大家還是看官方最新的英文版比較好。

打開命令提示符,進入想要創建項目的目錄,運行

scrapy startproject scrapyTest

項目創建完成,讓我們來看一下項目結構,執行:

tree /f

└─scrapyTest
    │  scrapy.cfg           
    │
    └─scrapyTest
        │  items.py         
        │  middlewares.py   
        │  pipelines.py     
        │  settings.py      
        │  __init__.py
        │
        ├─spiders           
        │  │  __init__.py
        │  │
        │  └─__pycache__
        └─__pycache__

進入spiders目錄,新建test_spider.py如下:



import scrapy
from bs4 import BeautifulSoup


class tsSpride(scrapy.Spider):
    name = 'test' 

    
    def start_requests(self):
        
        urls = ['http://www.jianshu.com/',]
        
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        for url in urls:
            yield scrapy.Request(url=url, headers=headers, callback=self.parse)

    
    def parse(self, response):
        soup = BeautifulSoup(response.body, 'html.parser')
        titles = soup.find_all('a', 'title')
        for title in titles:
            print(title.string)

在命令行輸入

scrapy crawl test

結果如下:


上述代碼Scrapy為start_requests 中的每個URL創建了scrapy.Request對象,並將 parse() 方法作為回調函數(callback)賦值給了Request(Scray中parse()為默認回調方法)。


七 Scrapy小例子

之前我們知道了Scrapy中每個文件所代表的含義,這次我們就以爬取拉勾網Python相關招聘信息來具體演示下Scrapy每個文件的用法。

我們要做的是,將拉勾網以『Python』為關鍵字搜索到的招聘信息前五頁爬下來,然後將其中的『職位』、『薪資』、『學歷要求』、『工作地點』、『公司名稱』以及『信息發布時間』提取出來並存儲到MySQL資料庫中。

(一)準備工作

我們先到拉勾網,在技術一欄中點擊Python,得到如下頁面:

點擊下一頁,觀察地址欄URL的變化:

第二頁的URL
https://www.lagou.com/zhaopin/Python/2/?filterOption=2

我們可以發現,頁碼的變化體現在URL中的兩個數字上,由此,我們便可以得到我們需要爬取的5個頁面的URL分別為:

urls = ['https://www.lagou.com/zhaopin/Python/1/?filterOption=1',
                'https://www.lagou.com/zhaopin/Python/2/?filterOption=2',
                'https://www.lagou.com/zhaopin/Python/3/?filterOption=3',
                'https://www.lagou.com/zhaopin/Python/4/?filterOption=4',
                'https://www.lagou.com/zhaopin/Python/5/?filterOption=5',
                ]

整理好需要爬取的URL後,我們來按F12打開開發者工具,找我們需要提取的信息:

可以看到需要爬取的信息都在<li>標籤中沒,右鍵複製一個li標籤,整理一下格式,得到如下代碼:

<li class="con_list_item default_list" data-index="3" data-positionid="991482" data-salary="8k-16k" data-company="昆明俊雲科技有限公司" data-positionname="Python開發工程師" data-companyid="67804" data-hrid="1346958">
    <div class="list_item_top">
        <div class="position">
            <div class="p_top">

                <a class="position_link" href="//www.lagou.com/jobs/991482.html" target="_blank" data-index="3" data-lg-tj-id="8E00" data-lg-tj-no="0104" data-lg-tj-cid="991482" data-lg-tj-abt="dm-csearch-useSalarySorter|1">

                <h2 style="max-width: 180px;">Python開發工程師</h2>

                <span class="add">[<em>昆明·盤龍區</em>]</span>
                <span class="format-time">1天前發布</span>
            </div>

            <div class="p_bot">
                <div class="li_b_l">
                    <span class="money">8k-16k</span>
                        經驗1-3年 / 本科
                </div>
            </div>
        </div>

        <div class="company">
            <div class="company_name">
                <a href="//www.lagou.com/gongsi/67804.html" target="_blank" data-lg-tj-id="8F00" data-lg-tj-no="0104" data-lg-tj-cid="67804" data-lg-tj-abt="dm-csearch-useSalarySorter|1">昆明俊雲科技有限公司</a><i class="company_mark"><span>該企業已上傳營業執照並通過資質驗證審核</span></i>

            </div>

            <div class="industry">
                移動網際網路,硬體 / 初創型(不需要融資)
            </div>
        </div>

        <div class="com_logo">
            <a href="//www.lagou.com/gongsi/67804.html" target="_blank" data-lg-tj-id="8G00" data-lg-tj-no="0104" data-lg-tj-cid="67804" data-lg-tj-abt="dm-csearch-useSalarySorter|1">![](//www.lgstatic.com/thumbnail_120x120/i/image/M00/58/0F/Cgp3O1fSFEuAQJnSAAATSLVt79k366.jpg)</a>
        </div>
    </div>

    <div class="list_item_bot">
        <div class="li_b_l">
            <div class="li_b_r">
            「福利優厚、期權獎勵、五險一金、工作餐」
            </div>
    </div>
</li>

可以發現,<li>標籤屬性中有我們需要的』職位『、』薪資『、』公司名稱『,而』工作地點『、』學歷要求『和』信息發布時間『則在下面的各個標籤中,於是我們可以使用如下代碼,提取各個信息(Beautiful Soup):

info = BeautifulSoup(response.body, 'html.parser').find('li','con_list_item default_list')
 info.attrs['data-positionname'],  
info.attrs['data-salary']
 info.find('em').get_text().split('·')[0],  
 (info.find('span', 'format-time')).string,  
 info.find('div', 'li_b_l').get_text().split('/')[-1],  
 info.attrs['data-company'],  

(二)資料庫的創建

先來建好資料庫,這裡使用的是MySQL資料庫,建立如下:

DROP TABLE IF EXISTS `info01`;
CREATE TABLE `info01` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `salary` int(255) NOT NULL,
  `position` varchar(255) NOT NULL,
  `time` varchar(255) NOT NULL,
  `grade` varchar(255) NOT NULL,
  `company` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=498 DEFAULT CHARSET=utf8;

要注意的是,其中的id屬性設為自增,’salary『屬性設為int類型,方便以後進行數據分析統計。

(三)代碼編寫


準備工作完成了,下面開始代碼部分,先到工作目錄中建立工程,在命令行中:

scrapy startproject lgSpider

先編輯items.py文件,該文件是一個簡單的數據收集容器,用於保存爬蟲爬取的數據,類似一個字典:




import scrapy

class LgspiderItem(scrapy.Item):
    
    
    title = scrapy.Field()     
    position = scrapy.Field()  
    salary = scrapy.Field()    
    company = scrapy.Field()   
    time = scrapy.Field()      
    grade = scrapy.Field()     

在spiders中建立爬蟲文件lg_spider.py如下:


import scrapy
from bs4 import BeautifulSoup


class lg_spider(scrapy.Spider):
    name = 'lg'  

    def start_requests(self):
        
        urls = ['https://www.lagou.com/zhaopin/Python/1/?filterOption=1',
                'https://www.lagou.com/zhaopin/Python/2/?filterOption=2',
                'https://www.lagou.com/zhaopin/Python/3/?filterOption=3',
                'https://www.lagou.com/zhaopin/Python/4/?filterOption=4',
                'https://www.lagou.com/zhaopin/Python/5/?filterOption=5',
                ]
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        for url in urls:
            yield scrapy.Request(url=url, headers=headers, callback=self.parse)

    def parse(self, response):
        
        soup = BeautifulSoup(response.body, 'html.parser')
        for info in soup.find_all('li', 'con_list_item default_list'):
            
            salary = info.attrs['data-salary'].split('k')[0]
            salary = int(salary) * 1000
            
            yield {
                'title': info.attrs['data-positionname'],  
                'position': info.find('em').get_text().split('·')[0],  
                'salary': salary,  
                'time': (info.find('span', 'format-time')).string,  
                'grade': info.find('div', 'li_b_l').get_text().split('/')[-1],  
                'company': info.attrs['data-company'],  
            }

爬取的item被收集起來後,會被傳送到pipelines中,進行一些處理,下面開始編輯pipelines.py用於將爬取的數據存入MySQL資料庫,



import pymysql


db_config = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'password': '',
    'db': 'lg_info',
    'charset': 'utf8'
}


class LgspiderPipeline(object):
    
    def __init__(self):
        self.connection = connection = pymysql.connect(**db_config)
        self.cursor = self.connection.cursor()

    
    def process_item(self, item, spider):
        
        sql = 'insert into info01(title, salary, position, time, grade, company) values(%s, %s, %s, %s, %s, %s)'
        try:
            self.cursor.execute(sql, (item['title'].encode('utf-8'),
                                      item['salary'],
                                      item['position'].encode('utf-8'),
                                      item['time'].encode('utf-8'),
                                      item['grade'].encode('utf-8'),
                                      item['company'].encode('utf-8'),
                                      )
                                )
            self.connection.commit()
        except pymysql.Error as e:
            
            print(e.args)
        return item

最後,再來配置settings.py文件,打開settings.py文件,會發現其中有很多注釋,我們找到

它代表使用使用指定的pipeline,將其修改為如下格式:

# LgspiderPipeline即我們寫的pipelines.py中的LgspiderPipeline類ITEM_PIPELINES = {   'lgSpider.pipelines.LgspiderPipeline': 300,
}

OK。所有工作都完成了,我們來執行一下爬蟲看一下效果;

刷新一下資料庫:


現在我們就可以通過sql語言,進行簡單的數據統計,如找出所有最低工資高於10000的招聘信息:

select * FROM info01 WHERE salary>10000

'''
作者:Veniendeavor
連結:https://www.jianshu.com/p/2cc8310a51c4
'''

相關焦點

  • Python開發簡單爬蟲【學習資料總結】
    一、簡單爬蟲架構 二、URL管理器和實現方法 防止重複抓取、防止循環抓取
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    scrapy框架及案例 21數據分析 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2
  • Python爬蟲:一些常用的爬蟲技巧總結
    也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。爬蟲在開發過程中也有很多復用的過程,這裡總結一下,以後也能省些事情。
  • 適合新手學習的Python爬蟲書籍
    點擊藍字「python
  • Python 爬蟲:8 個常用的爬蟲技巧總結!
    用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本
  • 聊聊學python轉行、具體學習方法、自學python用於辦公、寫爬蟲等...
    那今天就來說說學python這件事兒吧,從三個方面來說:第一,學了python之後轉行找工作的問題;第二,具體的學習方法;第三,講講學了python之後應用於辦公自動化和寫爬蟲。4600字。關於恰飯:不用猜了,這篇依舊沒有廣告。
  • Python爬蟲學習的完整路線推薦
    基於python爬蟲,我們整理了一個完整的學習框架:篩選和甄別學習哪些知識,在哪裡去獲取資源是許多初學者共同面臨的問題。接下來,我們將學習框架進行拆解,分別對每個部分進行詳細介紹和推薦一些相關資源,告訴你學什麼、怎麼學、在哪裡學。爬蟲是一種按照一定的規則,自動地抓取全球資訊網信息的程序或者腳本。
  • 非科班出身自學Python,難嗎?講解Python學習路線實用方法
    今天給大家推薦一篇前輩自學Python的總結文章。希望你從中有所收穫。我不是技術類在職人士,完全屬於崗外人員。由於長期從事非技術類崗位的工作,無論對web開發還是數據分析,相關知識都比較欠缺。另外由於工作比較忙,不能保證每天都有機會使用網際網路,我看到的是:很多學習python的朋友都要比我有優勢。
  • python實踐:利用爬蟲刷網課
    前言:用過python的人應該都會知道爬蟲這個東西,網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網信息的程序或者腳本。今天就來講講如何利用爬蟲技術刷網課。實戰:最近學校又推送了一波網課,一個一個的看實在太費時間,於是乎就想到了爬蟲來自動刷網課。
  • 從零開始的python爬蟲速成指南
    在前言:最近後臺有人留言問:有沒有python爬蟲的相關教程,爬蟲不是我專業方向,很多不是很熟悉,而網上很多資料講的過於散亂,不能很好的系統性學習爬蟲,而且水平參差不齊。特委託一位熟悉爬蟲的小夥伴,幫忙把關,將網上現有資料進行整合,整理了一份相對比較系統的資料。
  • Python 爬蟲「學前班」!學會免踩坑!
    作者 | 喵叔責編 | 胡巍巍爬蟲應用的廣泛,例如搜尋引擎、採集數據、廣告過濾、數據分析等。當我們對少數網站內容進行爬取時寫多個爬蟲還是有可能的,但是對於需要爬取多個網站內容的項目來說是不可能編寫多個爬蟲的,這個時候我們就需要智能爬蟲。
  • 10個Python爬蟲入門實例
    來源:cnblogs.com/h3zh1/p/12548946.html昨天帶夥伴們學習
  • Python網絡爬蟲教程+數據分析+機器學習
    : 程式設計師小樂 舉報   前段時間,小夥伴多次在後臺留言詢問Python爬蟲教程
  • python 爬蟲 | 解析庫之 XPath(1)
    自己學習 python 爬蟲已經有段時間了,但編程的學習過程總是邊學邊忘
  • Python學習第141課——Python爬蟲簡介
    【每天幾分鐘,從零入門python編程的世界!】今天我們簡單的了解下網絡爬蟲,網絡爬蟲其實就是一個自動獲取網頁內容的程序。Python的爬蟲需要用到一個第三方的庫requests。requests庫可以在git bash中使用命令pip install requests進行安裝。
  • Python新手學習網絡爬蟲要做什麼?
    傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,再不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。我們自學一段時間Python後想要學習網絡爬蟲,需要做些什麼嗎?Python網絡爬蟲學習,不需要你深入學習html,只要知道掌握它常用的簡單標籤跟知識點就行。
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。
  • 全網最全的Python爬蟲知識點總結
    什麼是爬蟲。簡單一句話就是代替人去模擬瀏覽器進行網頁操作。爬蟲的作用。為其他程序提供數據源,如搜尋引擎(百度、Google等)、數據分析、大數據等等。爬蟲又分為這分類:分為通用爬蟲(搜尋引擎、聚焦爬蟲(12306搶票) 、增量式網絡爬蟲(Incremental Web Crawler)和深層網絡爬蟲。掌握爬蟲具體要學習哪些知識點了?
  • Python系列文章複習總結
    Python系列文章複習總結終於,python文章已經更新完了,這裡做出一下總結複習,相當於是整合出一個目錄以便大家使用。文章的章節梳理在下文中,針對文章的視頻版梳理整理在公眾號左下角找到。主要內容:基礎知識 & 環境搭建。PyCharm的基礎使用。
  • python爬蟲入門-通過茅臺腳本講些爬蟲知識,應用和價值
    前言前段時間搶茅臺腳本非常火,它是Python腳本,加上剛好最近在學習Python,我們準備通過這個腳本,來加深學習Python。