吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3289|回复: 3
收起左侧

[Python 原创] 【python】版本35 正则-非库-爬虫-读写xlw文件

[复制链接]
52pojietest 发表于 2019-1-28 14:38
#交代:代码凌乱,新手一个,论坛都是高手,我也是鼓了很大勇气,发出来就是被批评和进步的

#需求:需要对某网站的某id子标签批量爬取,每个网页的id在xlw里,爬取完,再批量存取到这xlw里的第6行

#思路:1.批量从xlw读url;2.批量正则内容;3.批量写xlw

"""              ------------------警告

纯新手代码,代码凌乱,没有多线程,大概有600多网页,我还sleep1秒,没有用bs4其他的爬虫库,代码没啥亮点,

主要就是

正则到的内容list存储并使用reduce,追加连在一次,是内容连续#一开始我是两次正则,然后追加,使原本分散在各个标签的内容连续在一起,最后就需求降低,只需要把子标签内容抓到就好。

读写xlw的两个库openpyxl和xlrd,xlwt的取舍优缺点,

还有如果request到某页面,如果无响应非404等服务器错误时,使用了try反复request该页面

"""
[Python] 纯文本查看 复制代码
from urllib import request
from urllib import request
from urllib import error
import io
import sys
import re
from functools import reduce
import xlrd,xlwt
import numpy as np
import time
from xlutils.copy import copy
from openpyxl import Workbook
from openpyxl import load_workbook
#python 35
#
class Spider():
    new_excel_file = xlwt.Workbook(encoding='utf-8')
    readbook1 = xlrd.open_workbook(r'C:\\mingshi1.xlsx')
    url = 'http://*****************x?id='
    one_pattern = '<div id="artDiv" style="border:0; background-color:#fff; font-size:14px;line-height:180%">([\s\S]*?)</div>'
    lieshu=0
    
    #one1_pattern = '>([\s\S]*?)<'

    def fetch_content(self,url1):#正则匹配
        while(1):
                try:
                    r = request.urlopen(url1)
                    htmls = r.read()
                    htmls = str(htmls,encoding='utf-8')
                    #print(htmls)
                    return htmls
                    break

                except error.HTTPError as e:
                    print(e.code)
                    self.Error_input()

                except error.URLError as e:
                    print(e.reason)
                    self.Error_input()

    def Error_input(self):#遇到URL或者HTTP错误提示
        Error_if = input("Some Error, (enter)here we go?**************************(everything) Exit")
        if Error_if:
            sys.exit()
        else:
            pass

    def analysis(self,htmls):#处理正则后的数据
        one_html = re.findall(Spider.one_pattern,htmls)
        #print (one_html)
        if one_html:
            for html in one_html:
                content = html
                # content = re.findall(Spider.one_pattern,html)
                print(len(content))
                if len(content):
                    t1 = reduce(lambda x,y:x+y,content)
                else:  
                    t1 = ' '
        else:
            t1= ' '
        #print(t)
        return t1



    def go(self):#循环 读 xlw和循环 写 xlw
        """  
        循环读xlw
        """
        #定义循环 读 xlw的变量
        readbook = xlrd.open_workbook(r'C:\\mingshi.xlsx')
        table = readbook.sheets()[0]
        start=1  #开始的行
        end=639  #结束的行
                

        list_values=[]
                                                                                                    #执行循序 1.1循环 读 第1列xlw的代码块,上面变量有行数的开始行和结束行
        #
        for x in range(start,end):
            values=[]
            row =table.row_values(x)
            for i in range(1):
                values.append(row[i])
            list_values.append(values)
        datamatrix=list(np.array(list_values))
        #print(type(datamatrix))
        """  
        循环写xlw
        """
        #定义循环 写 xlw的变量
        wb = load_workbook(r'C:\\mingshi11111.xlsx')
        ws=wb.active
        hangshu = 1 #行
        lieshu = 5  #列
        rows=[]
        for row in ws.iter_rows():#获取所有行
            rows.append(row)
        """
        #抛弃使用xlsw库,缺点:写xlw会有大小限制,超过限制会出错
        # 写xls w for循环外
        # book1 = xlrd.open_workbook(r'路径')
        # book2 = copy(book1)#拷贝一份原来的excel
        # sheet = book2.get_sheet(0)#获取第几个sheet页,book2现在的是xlutils里的方法,不是xlrd的
        """
        #循环读xlw的代码块和url+id处理
        for y in datamatrix:
            url1=("http://*********************?id="+str(int(y)))
            #url1=("http://**************************?id=20131210120041954")
            #
            print(('*')*127)
            print("url:"+url1)                                                                     #执行循序2.1 打印第一个url
            print(('*')*127)
            htmls = self.fetch_content(url1)                                                        #执行循序2.2 正则htmls
            self.analysis(htmls)                                                                    #执行循序2.3 过滤htmls放入list后使用reduce追加内容,变成一体连续内容
            
            """
            openpyxl_start
            """
                                                                                                    #执行循序3.1 写xlw文件
            print('正在写入第'+str(hangshu)+'行')
            if hangshu == 639:#
                    
                break
            else: 
                rows[hangshu][lieshu].value = self.analysis(htmls) #[hangshu][lieshu]第hangshu行,第lieshu列
                wb.save("C:\\mingshi111111.xlsx")
                print('已写入第'+str(hangshu)+'行')
                hangshu+=1

            #
            """ 
            写xls w 循环内
            """
            
            """ 
            if lieshu==639: #写循环次数
                
                break
            else:
                sheet.write(lieshu, 5, self.analysis(htmls))
                book2.save('c:\\ms.xls')
                lieshu+=1 
            """
            """  
            注释
            """
            print(('*')*127)
            print('sleep 1秒')
            print(('*')*127)
            time.sleep(1)

spider = Spider()
spider.go()


原.png
xlw.png
分散.png
网页截图.png

免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

q30416657 发表于 2019-1-28 15:10
没细看 不过fetch_content方法中的while最好写成while True:
也可以使用递归代替循环
[Python] 纯文本查看 复制代码
def fetch_content(self, url1):  # 正则匹配
    try:
        r = request.urlopen(url1)
        htmls = r.read()
        htmls = str(htmls, encoding='utf-8')
        # print(htmls)
    except error.HTTPError as e:
        print(e.code)
        self.Error_input()
        fetch_content(url1); # 这里用递归代替while循环。
    except error.URLError as e:
        print(e.reason)
        self.Error_input()
        fetch_content(url1);  # 这里用递归代替while循环。
    return htmls
放牛少年 发表于 2019-1-28 15:12
logo_tu 发表于 2019-1-28 16:49
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 05:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表