1. 程式人生 > >python獲取網頁page數,同時按照href批量爬取網頁(requests+BeautifulSoup)

python獲取網頁page數,同時按照href批量爬取網頁(requests+BeautifulSoup)

本篇部落格是上篇部落格(http://blog.csdn.net/trisyp/article/details/78732630)的傳參版,即通過html元素獲取頁面的所有href,然後逐個爬取

完整程式碼如下:

import requests
from bs4 import BeautifulSoup
import os
import time
import datetime as dt
from datetime import datetime

week_day_dict = ['週一', '週二', '週三', '週四', '週五', '週六', '週日']

def getHTML(url):
    headers = {'User-Agent'
:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.0 Safari/537.36'} r = requests.get(url, headers) r.raise_for_status() r.encoding = r.apparent_encoding r.close() return r.text def getPages(html): soup = BeautifulSoup(html, 'html.parser') # 用HTML解析網址
tag = soup.find_all('table', attrs={'class': {'m-page'}}) pageTag = tag[0].find_all('ul') pageTag1 = pageTag[0].find_all('li') pageCount = pageTag1[-3].text return int(pageCount) def getHrefs(html): soup = BeautifulSoup(html, 'html.parser') # 用HTML解析網址 tag = soup.find_all('table'
, attrs={'class': {'m-tab'}}) hrefTag = tag[0].find_all('tr') del hrefTag[-1] del hrefTag[-1] hrefs = [] for i in range(len(hrefTag)): hrefTag1 = hrefTag[i].find_all('td') hrefTag2 = hrefTag1[-2].find_all('a') hrefs.append(hrefTag2[0].get('href')) return hrefs def getTableName(html): #獲取每個table的表名 soup = BeautifulSoup(html, 'html.parser') # 用HTML解析網址 tag = soup.find_all('div', attrs={'class': {'kj-tit'}}) tableName = [] for infoi in tag: tableName.append(infoi.text.replace("\n", "").replace(" ", "")) return tableName def fillUnivlist(html): #儲存網頁中間兩個表格的內容 result = [] tableNames = getTableName(html) # 獲取表名 soup = BeautifulSoup(html, 'html.parser') # 用HTML解析網址 timeTag = soup.find_all('div', attrs={'class': {'c-time'}}) numTag = soup.find_all('div', attrs={'class': {'c-num'}}) ctime = timeTag[0].text[29:39] num = numTag[0].text[0:5] ctimeweek = datetime.strptime(ctime, "%Y-%m-%d") if week_day_dict[ctimeweek.weekday()-1]==num[0:2]: oneday = dt.timedelta(days=1) ctimeweek1 = ctimeweek-oneday ctime1 = ctimeweek1.strftime("%Y-%m-%d") dateNumbers = ctime1.replace("-", "") + num[2:5] else: dateNumbers = ctime + num tag = soup.find_all('table', attrs={'class': {'kj-table'}}) # 獲取所有表格 # print(str(tag[0])) for i in range(1, 3): infoTag = tag[i] contentTr = infoTag.find_all('tr') for j in range(len(contentTr)): if j == 0: contentTh = contentTr[j].find_all('th') info1 = dateNumbers + "," + tableNames[i] for infok in contentTh: info1 = info1 + "," + infok.text.replace(" ", "") else: contentTd = contentTr[j].find_all('td') info1 = dateNumbers + "," + tableNames[i] for infok in contentTd: info1 = info1 + "," + infok.text result.append(info1) return result def writeUnivlist(result, fpath, num): with open(fpath, 'a', encoding='utf-8') as f: #以追加的方式儲存內容 for i in range(num): f.write(result[i] + '\n') f.close() def main(): startDate = input("startDate(格式為yyyy-mm-dd):") lastDate = input("lastDate(格式為yyyy-mm-dd):") url = "http://info.sporttery.cn/basketball/match_result.php?page=1&start_date="+startDate+"&end_date="+lastDate html = getHTML(url) pageNumber = getPages(html) time.sleep(2) hrefs = getHrefs(html) count = 1 for i in range(2, pageNumber+1): url = "http://info.sporttery.cn/basketball/match_result.php?page="+str(i)+"&start_date="+startDate+"&end_date="+lastDate html = getHTML(url) time.sleep(1) href = getHrefs(html) for hj in href: hrefs.append(hj) time.sleep(1) count += 1 print("\r當前page進度: {:.2f}%".format(count * 100 / pageNumber), end="") # output_href = 'D:/JCWBasketballHrefs.txt' # writeUnivlist(hrefs, output_href, len(hrefs)) count = 0 output_file = 'D:/JCWBasketball.txt' hrefNumber = len(hrefs) for i in range(hrefNumber): time.sleep(1) result = fillUnivlist(getHTML(hrefs[i])) time.sleep(1) writeUnivlist(result, output_file, len(result)) count += 1 print("\r當前href進度: {:.2f}%".format(count * 100 / hrefNumber), end="") if __name__ == '__main__': main()

相關推薦

python獲取網頁page同時按照href批量網頁requests+BeautifulSoup

本篇部落格是上篇部落格(http://blog.csdn.net/trisyp/article/details/78732630)的傳參版,即通過html元素獲取頁面的所有href,然後逐個爬取 完整程式碼如下: import requests from bs4 impo

python獲取tcp連線新增連線繪圖用於效能測試過程中監控

本指令碼可以用於有效能測試監控需求的人使用,用於tcp連線數的監控# -*- coding: UTF-8 -*- # author=baird_xiang import os import sys import time import re import copy new_

python初級實戰系列教程《一、爬蟲之網頁、圖片、音視訊》

python基礎知識可以到廖雪峰大佬的官網學習哦! 廖雪峰官網網址 學完python就開始我們的實戰吧!首先我們就來學習下python爬蟲 學習Python爬蟲,先是介紹一個最容易上手的庫urll

不會Python爬蟲?教你一個通用爬蟲思路輕鬆網頁資料

  前言 其實爬蟲的思路很簡單,但是對於很多初學者而言,看得懂,但是自己寫的時候就不知道怎麼去分析了!說實話還是寫少了,自己不要老是抄程式碼,多動手! 本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位

ScrapyAjax非同步載入網頁例項——簡書付費連載

這兩天學習了Scrapy爬蟲框架的基本使用,練習的例子爬取的都是傳統的直接載入完網頁的內容,就想試試爬取用Ajax技術載入的網頁。 這裡以簡書裡的優選連載網頁為例分享一下我的爬取過程。 網址為: https://www.jianshu.com/mobile/books?category_id=28

java使用jsoup多執行緒批量天極網某分類下的圖片

 小Demo轉自csdn某作者, 本例子只作為測試,頁面個數直接設定了100個,可以可能會少或者多,容易報錯,更優化的一種方式是獲取“下一頁”按鈕的地址,然後再訪問,當訪問不到“下一頁”的內容時跳出 多執行緒只體現在檔案提取,也可以在elements迴圈中再加一個多執行緒

java使用jsoup多執行緒批量天極網某分類下的美女圖片

本例子只作為測試,頁面個數直接設定了100個,可以可能會少或者多,容易報錯,更優化的一種方式是獲取“下一頁”按鈕的地址,然後再訪問,當訪問不到“下一頁”的內容時跳出 多執行緒只體現在檔案提取,也可以在elements迴圈中再加一個多執行緒訪問頁面的 本案例需要jsoup包的

Python 獲取接口解析JSON,寫入文件

key pri gis http 例子 tlist eat port 寫入 Python 獲取接口數據,解析JSON,寫入文件 用於練手的例子,從國家氣象局接口上獲取JSON數據,將它寫入文件中,並解析JSON; 總的來說,在代碼量上,python代碼量要比java少很多。

Python獲取Nginx訪問日誌寫入據庫

use arc strip() for create variables *** times war #!/usr/bin/env python # coding: utf-8 # Auther:liangkai # Date:2018/6/26 11:26 # Licen

python第三節函文件操作

python函數 文件處理 文件操作#以讀的方式打開文件# f=open(‘c.txt‘,encoding=‘utf-8‘)# print(f)# data = f.read() #以讀的方式打開# print(data)# print(f.closed) #判斷文件是否是關閉狀態# print(f.

第七篇 python基礎之函遞歸內置函

不能 初中 隱式 邏輯 改變 維護 mage 提醒 發送郵件 第七篇 python基礎之函數,遞歸,內置函數 閱讀目錄 一 數學定義的函數與python中的函數 二 為何使用函數 背景提要 三 函數和過程 四 函數參數 五 局部變量和全局變量 六 前向引用之‘函

Python基礎課:定義一個函可以對序列逆序的輸出對於列表和元組可以不用考慮嵌套的情況

int 情況 type spa list bsp pri not log 1 15 def fun(arg): 2 16 if type(arg) is not tuple 3 17 and type(arg) is not str 4 18

python網絡編程通過服務名稱和會話類型tcpudp獲取端口號簡單的異常處理

one span try num python網絡 int 代碼 sys.argv 通過 作為一個php程序員,同時有對網絡方面感興趣,php就比較蛋疼了,所以就抽了些時間看python 之前學python基礎因為工作原因,斷斷續續的看了個基礎,差不多是可以寫代碼了 最近在

python-遞歸函嵌套函

pytho 規模 binary 回溯 作用 family strong while 直接 遞歸函數: 在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。 例: def calc(n): print(n) if in

python之內置函匿名函

__next__ 最小 exec inpu list alt 自動生成 def 都是 什麽是內置函數? 就是Python給你提供的,拿來直接用的函數,比如print,input等等。其實就是我們在創建.py的時候python解釋器所自動生成的內置的函數,就好比我們之前所學的

Python lambda匿名函遞歸應用

os.path 讀取 pen contain path dsw file 函數 join import os ‘‘‘Lambda函數能接收任何數量的參數但只能返回一個表達式的值匿名函數不能直接調用print,因為lambda需要一個表達式‘‘‘sum = lambda x,

python spark中parquet檔案寫到hdfs同時避免太多的小檔案block小檔案合併

    在pyspark中,使用資料框的檔案寫出函式write.parquet經常會生成太多的小檔案,例如申請了100個block,而每個block中的結果 只有幾百K,這在機器學習演算法的結果輸出中經常出現,這是一種很大的資源浪費,那麼如何同時避免太多的小檔案(bloc

Python實現指令碼鎖功能同時只能執行一個指令碼

1. 檔案鎖 指令碼啟動前檢查特定檔案是否存在,不存在就啟動並新建檔案,指令碼結束後刪掉特定檔案。 通過檔案的判斷來確定指令碼是否正在執行。 方法實現也比較簡單,這裡以python指令碼為例 #coding=utf-8 # #   檔案鎖指令碼測試 # import os

thymeleaf和freemarker從物件中獲取時間並格式化同時非空判斷

thymeleaf,freemarker從物件中獲取時間並格式化,同時非空判斷 freemarker物件非空判斷:${(creditInformationDO.delFlag)!} freemarker從物件中獲取時間並格式化:${(creditInformationD

python獲取redis連線等資訊

# -*- coding: utf-8 -*- __author__ = 'Administrator' __time__ = '2018-04-28 上午 10:34' import redis import sys import time HOST='172.18.10