python 使用uszipcode的所有美国邮政编码列表

kmb7vmvb  于 2023-02-28  发布在  Python
关注(0)|答案(5)|浏览(251)

我一直试图获取所有美国邮政编码的网页抓取项目为我的公司。我正试图使用uszipcode库自动做这件事,而不是手动从我感兴趣的网站,但无法弄清楚。
这是我的手动尝试:

from bs4 import BeautifulSoup
import requests

url = 'https://www.unitedstateszipcodes.org'
headers = {'User-Agent': 'Chrome/50.0.2661.102'}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')

hrefs = []
all_zipcodes = []

# Extract all
for data in soup.find_all('div', class_='state-list'):
    for a in data.find_all('a'):
        if a is not None:
            hrefs.append(a.get('href'))
hrefs.remove(None)


def get_zipcode_list():
    """
           get_zipcode_list gets the GET response from the web archives server using CDX API
           :return: CDX API output in json format.
        """
    for state in hrefs:
        state_url = url + state
        state_page = requests.get(state_url, headers=headers)
        states_soup = BeautifulSoup(state_page.text, 'html.parser')
        div = states_soup.find(class_='list-group')
        for a in div.findAll('a'):
            if str(a.string).isdigit():
                all_zipcodes.append(a.string)
    return all_zipcodes

这需要大量的时间,并希望知道如何做同样的更有效的方式使用uszipcodes

lnxxn5zx

lnxxn5zx1#

您可以尝试按模式“”搜索

s = SearchEngine()
l = s.by_pattern('', returns=1000000)
print(len(l))

更多详细信息请参见文档及其基础教程

kd3sttzy

kd3sttzy2#

engine = SearchEngine()
allzips = {}
for i in range(100000): #Get zipcode info for every possible 5-digit combination
    zipcode = str(i).zfill(5)
    try: allzips[zipcode] = engine.by_zipcode(zipcode).to_dict()
    except: pass
#Convert dictionary to DataFrame
allzips = pd.DataFrame(allzips).T.reset_index(drop = True)

由于邮政编码只有5位数,因此可以迭代100k,并查看哪些邮政编码不会返回错误。此解决方案为您提供一个DataFrame,其中包含每个保存的邮政编码的所有存储信息

sczxawaw

sczxawaw3#

美国邮政编码的正则表达式是[0-9]{5}(?:-[0-9]{4})?
你可以简单地用re模块检查

import re
regex = r"[0-9]{5}(?:-[0-9]{4})?"
if re.match(zipcode, regex):
    print("match")
else:
    print("not a match")
hgtggwj0

hgtggwj04#

我能够得到~ 42,150邮政编码为一个类似的项目。想展示我的工作,因为我用这个线程作为一个起点。

import us
from uszipcode import SearchEngine, SimpleZipcode
import os

#Creates a txt file named "zips" with zipcodes
#sorted by state then density

states = [state.name for state in us.states.STATES]
states.append('Washington DC')
engine = SearchEngine()
convertedList = ""

with open("zips.txt", "w") as f:

    for i in states:
        zipcodes = engine.query(state=i, sort_by=SimpleZipcode.population_density, zipcode_type=None, returns=50000)
        print(i, len(zipcodes))
        for i in zipcodes:
            convertedList += i.zipcode + ", "

    print("Total Zipcodes = ", "{:,}".format(len(convertedList)//7))
    f.write(convertedList)

f.close()

#Remove trailing comma
with open("zips.txt", 'rb+') as f:
    f.seek(-2, os.SEEK_END)
    f.truncate()
    f.close()
ia2d9nvy

ia2d9nvy5#

您可以从official source)下载邮政编码列表,然后解析它(如果它是一次性使用的),并且您不需要与每个邮政编码相关联的任何其他元数据(如uszipcodes提供的元数据)。
uszipcodes也有另一个数据库,这是相当大的,应该有你需要的所有数据。

from uszipcode import SearchEngine
zipSearch = SearchEngine(simple_zipcode=False)
allZipCodes = zipSearch.by_pattern('', returns=200000)
print(len(allZipCodes)

相关问题