鱼C论坛

 找回密码
 立即注册
查看: 5688|回复: 35

Python爬虫

[复制链接]
发表于 2021-5-10 17:16:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
网页代码是下面这样的, 要怎么写正则表达式才能提取到250mW?
我这样写 re.compile(r'<td class=" ">(\d*)mW</td>',re.S), 结果是空值

<td class=" ">
                                

                                

                                
                                    250
                                

                                 mW
                            </td>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-10 17:21:40 From FishC Mobile | 显示全部楼层
\d+不就可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-10 17:35:13 | 显示全部楼层

可以麻烦写完整的语句吗? 谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-10 17:40:14 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2021-5-10 17:41 编辑

空格和换行你没算进去

写个丑陋的代码
import re

s = """<td class=" ">
                                

                                

                                
                                    250
                                

                                 mW
                            </td>"""

p = re.compile(r'<td class=" ">[\s\n]*(\d*)[\s\n]*mW[\s\n]*</td>',re.S)

r = p.search(s)

print(r.group(1))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-10 17:51:54 | 显示全部楼层
hrp 发表于 2021-5-10 17:40
空格和换行你没算进去

写个丑陋的代码

谢谢!

那像这样的 两个相同的标签, 要提取的值也没有特殊的模式, 要怎么写啊
#1

<td class=" ">
                                

                                

                                

                                    

                                    
                                        SURFACE MOUNT
                                    
                                

                                
                            </td>


#2

<td class=" ">
                                

                                

                                

                                    

                                    
                                        SMT
                                    
                                

                                
                            </td>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-10 19:00:34 From FishC Mobile | 显示全部楼层
grey_lemon 发表于 2021-5-10 17:51
谢谢!

那像这样的 两个相同的标签, 要提取的值也没有特殊的模式, 要怎么写啊

说说你到底要干嘛,一般class没有设置为空的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-10 20:49:27 | 显示全部楼层
wp231957 发表于 2021-5-10 19:00
说说你到底要干嘛,一般class没有设置为空的

这里要分别提取SURFACE MOUNT(#1) 和 SMT(#2)

总的目的要爬取这个网站上各个Part Number的参数信息
https://www.findchips.com/parame ... ort=false&page=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-10 21:15:02 | 显示全部楼层
用BeautiSoup提取html标签内的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-11 05:23:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-11 08:45:59 | 显示全部楼层
利用head 伪装之后运行后显示 403 Forbidden, 还有办法爬吗?
谢谢!

def askURL(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
    }
    request = urllib.request.Request(url,headers=head)
    html = ""

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 08:48:54 | 显示全部楼层
grey_lemon 发表于 2021-5-11 08:45
利用head 伪装之后运行后显示 403 Forbidden, 还有办法爬吗?
谢谢!

网站是这个

https://www.digikey.cn/en/produc ... h-hole-resistors/53
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-11 08:51:01 | 显示全部楼层
grey_lemon 发表于 2021-5-10 20:49
这里要分别提取SURFACE MOUNT(#1) 和 SMT(#2)

总的目的要爬取这个网站上各个Part Number的参数信息
import requests
from lxml import etree

url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="

res=requests.get(url)
tree = etree.HTML(res.text)
data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
for x in range (1,len(data)+1):
     col=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td"%x)
     for y in range(8,len(col)+1):
          txt=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td[%d]"%(x,y))
          print(txt[0].text.strip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 16:59:27 | 显示全部楼层

谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字来翻页, 是想把所有页码(第1页到第50页)的参数信息都提取出来。
运行之后没有变化。。
#2  for y in range(8,len(col)+1): 改为从第一列开始提取  for y in range(0,len(col)+1):
运行之后没有变化 。。
#3 能否实现把爬取到的信息列为类似网站显示的有标题栏的excel 的格式
import requests
from lxml import etree

url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="
for i in range(0,3):
     url = url + str(i)

res=requests.get(url)
tree = etree.HTML(res.text)
data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
for x in range (1,len(data)+1):
     col=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td"%x)
     for y in range(0,len(col)+1):
          txt=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td[%d]"%(x,y))
          print(txt[0].text.strip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 17:01:38 | 显示全部楼层

顺便问下pycharm代码怎么复制能粘贴为你这样的格式。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 06:53:24 From FishC Mobile | 显示全部楼层
grey_lemon 发表于 2021-5-11 16:59
谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字 ...

没有分析网页源码吗?还是不会呢,头七列和后面的格式不一样,pycharm没用过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 08:38:09 | 显示全部楼层
wp231957 发表于 2021-5-12 06:53
没有分析网页源码吗?还是不会呢,头七列和后面的格式不一样,pycharm没用过

刚开始学爬虫, 所以很多都是一知半解, 打算从实例深度学习。
谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 16:22:11 | 显示全部楼层
grey_lemon 发表于 2021-5-11 16:59
谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字 ...

给你写了一个txt版本的,xls版本的  你要是用 自己研究一下,
import requests,re
from lxml import etree

f=open("record.txt","w",encoding="utf-8")
for page in range(1,51):
     print("...............正在处理第 %d 页数据............"%page)
     url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="+str(page)
     res=requests.get(url)
     tree = etree.HTML(res.text)
     data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
     for x in range (1,len(data)+1):
          col=data[x-1].xpath("./td")
          try:
               three=col[2].xpath("./a/div/text()")[0].strip()+"  "
          except:
               three=""
          try:     
               three+=col[2].xpath("./span/text()")[0].strip()
          except:
               three=three     
          try:
               five=col[4].xpath("./a/text()")[0].strip()
          except:
               five=""
          try:          
               seven=col[6].xpath("./text()")[1].strip()
          except:
               seven=""
          line=three+","+five+","+seven+","
          for y in range(8,len(col)+1):
               line+=re.sub(" +"," ",col[y-1].text.strip().replace("\n",""))+","
          f.write(line[:-1]+"\n") 
          line=""   
f.close()    
print("ok")      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 07:55:57 | 显示全部楼层
wp231957 发表于 2021-5-12 16:22
给你写了一个txt版本的,xls版本的  你要是用 自己研究一下,

非常感谢! 我自己来研究一下试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 07:57:54 | 显示全部楼层
请教一下

我用以下代码结果运行后错误提示
403
Forbidden
是不是被识别出来是爬虫了? 已经用head 伪装过了, 还能用其他办法爬吗?

# -- coding = 'utf-8' --

from bs4 import BeautifulSoup
import re
import urllib.request, urllib.error
import xlwt
import sqlite3


def main():
    baseurl = "https://www.digikey.cn/en/products/filter/through-hole-resistors/53?s=N4IgrCBcoA5QjAGhDOl4AYMF9tA"
    datalist = getData(baseurl)
    savepath = ".\\Digikey.xls"
    #saveData
    askURL("https://www.digikey.cn/en/products/filter/through-hole-resistors/53?s=N4IgrCBcoA5QjAGhDOl4AYMF9tA")

def getData(baseurl):
    datalist = []
    return datalist

def askURL(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
    }
    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    # return html

def saveData(savepath):
    print("save...")

if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 08:18:34 From FishC Mobile | 显示全部楼层
grey_lemon 发表于 2021-5-13 07:57
请教一下

我用以下代码结果运行后错误提示

你这也不是那个网站了,我17楼代码是测试成功的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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