【发布时间】:2019-05-02 18:03:52
【问题描述】:
我正在使用 python 3 和美丽的汤来抓取联系方式,例如电子邮件和电话号码,其中的 url 是在给定关键字的帮助下从谷歌搜索中找到的。
我已经从网址中正确地抓取了电子邮件,但我无法从网站上准确地抓取电话号码。
from bs4 import BeautifulSoup
import sys
import requests
import urllib.request
import pandas as pd
from urllib.request import urlopen,urlparse, Request,HTTPError
import re
import numpy as np
import csv
import json
def get_keyword(word):
try:
from google search import search
except ImportError:
print("No module named 'google' found")
# to search
query = word
url=[]
for j in search (query, tld ="co.uk", num=10, stop=1, pause=2): url.append(j)
return url, word
def scrape(req1, word):
req2=req1
req1 = Request(req1, headers={'User-Agent': 'Mozilla/5.0 Chrome/24.0.1312.27 Safari/537.17 '})
f = url open(req1)
s = f.read().decode('UTF-8')
reg = "((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}"
phone = re. find all(reg, s)
emails = re. find all(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,3}",s) #Email regex
ph=[]
for i in phone:
g = list(filter(None, i))
g=''.join(g)
ph.append(g)
def Remove(duplicate):
final_list = []
for num in duplicate:
if num not in final_list:
final_list.append(num)
return final_list
k = Remove(ph)
df = pd.DataFrame(k, columns=['phone'])
df2 = pd.DataFrame(emails, columns=['email'])
df3 = pd.DataFrame([req2],columns=['url'])
new_df = df.join([df3,df2])
return new_df
if __name__ == '__main__':
df_new = pd.DataFrame(columns = ['email','url','phone'])
x, y=get_keyword("women entrepreneur")#keyword
print(x)
for i in x:
k = scrape(i, y) #i=links in the list of x which means list of url
df_new = pd.concat([df_new,k],ignore_index=True)
我想从网站上获取确切的电话号码,但实际上我得到了许多其他号码作为输出。示例(“电话”:“1761768436145”)不是准确的电话号码。如果没有找到号码,则应显示为“未找到电话号码”。
【问题讨论】:
-
也许使用更简单的
regexes -
您的代码中有随机空格。请更正它们。
标签: python-3.x web-scraping beautifulsoup